Исключение ошибки с сгенерированным кодом SlSvcUtil

#c# #web-services #windows-phone-7 #wsdl

#c# #веб-сервисы #windows-phone-7 #wsdl

Вопрос:

У меня есть веб-сервис со следующим файлом wsdl:

 <?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name="BBAppWebAccessService" targetNamespace="com.test" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="com.test" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <wsdl:types>
  <xs:schema elementFormDefault="unqualified" targetNamespace="com.test" version="1.0" xmlns:tns="com.test" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="getPOI" type="tns:getPOI" />
  <xs:element name="getPOIResponse" type="tns:getPOIResponse" />

  <xs:complexType name="poi">
  <xs:complexContent>
  <xs:extension base="tns:poiPreview">
  <xs:sequence>
  <xs:element maxOccurs="unbounded" minOccurs="0" name="images" nillable="true" type="tns:bbImage" />
  </xs:sequence>
  </xs:extension>
  </xs:complexContent>
  </xs:complexType>
    <xs:complexType name="poiPreview">

      <xs:sequence>
        <xs:element name="poiID" type="xs:int" />
        <xs:element maxOccurs="unbounded" minOccurs="0" name="thumbsnails" nillable="true" type="tns:bbImage" />
      </xs:sequence>
    </xs:complexType>
    <xs:complexType name="bbImage">
      <xs:sequence>
        <xs:element maxOccurs="unbounded" minOccurs="0" name="imageData" nillable="true" type="xs:byte" />
        <xs:element minOccurs="0" name="imageName" type="xs:string" />
        <xs:element name="imageID" type="xs:int" />
      </xs:sequence>
    </xs:complexType>
  <xs:complexType name="getPOI">
  <xs:sequence>
  <xs:element name="ID" type="xs:int" />
  </xs:sequence>
  </xs:complexType>
  <xs:complexType name="getPOIResponse">
  <xs:sequence>
  <xs:element minOccurs="0" name="return" type="tns:poi" />
  </xs:sequence>
  </xs:complexType>
  </xs:schema>
    </wsdl:types>
    <wsdl:message name="getPOI">
      <wsdl:part element="tns:getPOI" name="parameters">
      </wsdl:part>
    </wsdl:message>
    <wsdl:message name="getPOIResponse">
      <wsdl:part element="tns:getPOIResponse" name="parameters">
      </wsdl:part>
    </wsdl:message>
    <wsdl:portType name="BBAppWebAccess">
      <wsdl:operation name="getPOI">
        <wsdl:input message="tns:getPOI" name="getPOI">
      </wsdl:input>
        <wsdl:output message="tns:getPOIResponse" name="getPOIResponse">
      </wsdl:output>
      </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="BBAppWebAccessServiceSoapBinding" type="tns:BBAppWebAccess">
      <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
      <wsdl:operation name="getPOI">
        <soap:operation soapAction="" style="document" />
        <wsdl:input name="getPOI">
          <soap:body use="literal" />
        </wsdl:input>
        <wsdl:output name="getPOIResponse">
          <soap:body use="literal" />
        </wsdl:output>
      </wsdl:operation>
    </wsdl:binding>

    <wsdl:service name="BBAppWebAccessService">
      <wsdl:port binding="tns:BBAppWebAccessServiceSoapBinding" name="BBAppWebAccessPort">
        <soap:address location="http://localhost:8080/BBAppWeb/HelloWorld" />
      </wsdl:port>
    </wsdl:service>
  </wsdl:definitions>
  

Я использовал SlSvcUtil из Windows Phone SDK для генерации прокси-классов для c # SlSvcUtil.exe test.wsdl .

Это часть сгенерированного кода:

 [System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
[System.ServiceModel.MessageContractAttribute(WrapperName="getPOI", WrapperNamespace="com.test", IsWrapped=true)]
public partial class getPOI {

        [System.ServiceModel.MessageBodyMemberAttribute(Order=0)]
        [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
        public int ID;

        public getPOI() {
        }

        public getPOI(int ID) {
            this.ID = ID;
        }
}

private class BBAppWebAccessClientChannel : ChannelBase<BBAppWebAccess>, BBAppWebAccess
{

    public BBAppWebAccessClientChannel(System.ServiceModel.ClientBase<BBAppWebAccess> client) : 
            base(client)
    {
    }

    public System.IAsyncResult BegingetPOI(getPOI request, System.AsyncCallback callback, object asyncState)
    {
        object[] _args = new object[1];
        _args[0] = request;
        System.IAsyncResult _result = base.BeginInvoke("getPOI", _args, callback, asyncState);
        return _resu<
    }

    public getPOIResponse EndgetPOI(System.IAsyncResult result)
    {
        object[] _args = new object[0];
        getPOIResponse _result = ((getPOIResponse)(base.EndInvoke("getPOI", _args, result)));
        return _resu<
    }
}
  

Это вызывает исключение FaultException getPOIResponse _result = ((getPOIResponse)(base.EndInvoke("getPOI", _args, result))); .

Я вызываю веб-сервис со следующим кодом:

 private void Load_Initial_Data()
{
    try
    {
        BBAppWebAccessClient wac = new BBAppWebAccessClient();
        wac.getPOICompleted  = new EventHandler<getPOICompletedEventArgs>(client_GetDataCompleted);
        wac.getPOIAsync(1);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.StackTrace);
    }

}
void client_GetDataCompleted(object sender, getPOICompletedEventArgs e)
{
    //this.DataContext = e.Resu<
    Console.WriteLine(e.Result.poiID);
}
  

On the server side there is following exception:

 22:27:23,789 WARN  [org.apache.cxf.phase.PhaseInterceptorChain] Interceptor for {com.test}BBAppWebAccessService#{com.test}getPOI has thrown exception, unwinding now: org.apache.cxf.interceptor.Fault: Unmarshalling Error: unexpected element (uri:"com.test", local:"ID").
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:787) [:2.3.1-patch-01]
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:628) [:2.3.1-patch-01]
        at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:133) [:2.3.1-patch-01]
        at org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:109) [:2.3.1-patch-01]
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255) [:2.3.1-patch-01]
        at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:113) [:2.3.1-patch-01]
        at org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:97) [:2.3.1-patch-01]
        at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:461) [:2.3.1-patch-01]
        at org.jboss.wsf.stack.cxf.ServletControllerExt.invoke(ServletControllerExt.java:172) [:3.4.1.GA]
        at org.jboss.wsf.stack.cxf.RequestHandlerImpl.handleHttpRequest(RequestHandlerImpl.java:57) [:3.4.1.GA]
        at org.jboss.wsf.stack.cxf.transport.ServletHelper.callRequestHandler(ServletHelper.java:156) [:3.4.1.GA]
        at org.jboss.wsf.stack.cxf.CXFNonSpringServletExt.invoke(CXFNonSpringServletExt.java:90) [:3.4.1.GA]
        at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179) [:2.3.1-patch-01]
        at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:103) [:2.3.1-patch-01]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) [:1.0.0.Final]
        at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159) [:2.3.1-patch-01]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:324) [:6.1.0.Final]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:6.1.0.Final]
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [:6.1.0.Final]
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [:6.1.0.Final]
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:181) [:6.1.0.Final]
        at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.event(CatalinaContext.java:285) [:1.1.0.Final]
        at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.invoke(CatalinaContext.java:261) [:1.1.0.Final]
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:88) [:6.1.0.Final]
        at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:100) [:6.1.0.Final]
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:159) [:6.1.0.Final]
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [:6.1.0.Final]
        at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) [:6.1.0.Final]
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [:6.1.0.Final]
        at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:53) [:6.1.0.Final]
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [:6.1.0.Final]
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [:6.1.0.Final]
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654) [:6.1.0.Final]
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951) [:6.1.0.Final]
        at java.lang.Thread.run(Unknown Source) [:1.7.0]
Caused by: javax.xml.bind.UnmarshalException
 - with linked exception:
[com.sun.istack.SAXParseException2; lineNumber: 1; columnNumber: 197; unexpected element (uri:"com.test", local:"ID"). Expected elements are <{}ID>]
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:425) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:362) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:339) [:2.2]
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:764) [:2.3.1-patch-01]
        ... 34 more
Caused by: com.sun.istack.SAXParseException2; lineNumber: 1; columnNumber: 197; unexpected element (uri:"com.test", local:"ID"). Expected elements are <{}ID>
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:642) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:254) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:249) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:116) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.childElement(Loader.java:101) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.StructureLoader.childElement(StructureLoader.java:243) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:478) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:459) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElement(StAXStreamConnector.java:242) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:176) [:2.2]
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:360) [:2.2]
        ... 36 more
Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"com.test", local:"ID"). Expected elements are <{}ID>
        ... 47 more
  

ClientConfig:

 <?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BBAppWebAccessServiceSoapBinding" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="None" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8080/BBAppWeb/HelloWorld"
                binding="basicHttpBinding" bindingConfiguration="BBAppWebAccessServiceSoapBinding"
                contract="SilverlightApplication1.ServiceReference1.BBAppWebAccess"
                name="BBAppWebAccessPort" />
        </client>
    </system.serviceModel>
</configuration>
  

Сообщение, полученное с помощью Fiddler (Windows Phone):

 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <getPOI xmlns="com.test">
            <ID>1</ID>
        </getPOI><
    /s:Body>
</s:Envelope>
  

Сообщение, полученное с помощью Fiddler (Axis2):

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <ns1:getPOI xmlns:ns1="com.test">
            <ID>1</ID>
        </ns1:getPOI>
    </soapenv:Body>
</soapenv:Envelope>
  

Как я могу это исправить? Сгенерированный Java-код (Apache Axis2) отлично работает.

Спасибо за любые советы.

Комментарии:

1. Это может быть проблемой конфигурации. Вы пробовали генерировать код с помощью «Добавить ссылку на службу» в Visual Studio?

2. Да, я попробовал это, и я тоже получил ту же ошибку. Но не стесняйтесь протестировать это самостоятельно и сообщить о своих результатах.

3. Мне понадобится адрес службы.

4. Онлайн-сервиса нет, потому что он находится в стадии разработки. Прошу прощения.

5. ОК. Если вы опубликуете свою конфигурацию, я, возможно, все еще смогу помочь.

Ответ №1:

Я нашел решение. Когда вы создаете веб-сервис с Java EE, вы должны добавить все пространства имен, иначе вы получите ошибки, описанные выше.
После исправления FaultException я получил исключение NullReferenceException, которое указывает, что я также должен исправить обработку ответа.

Большое спасибо @calum.

Вот пример реализации веб-сервиса, который работает совместно с Axis2 и инструментом SLsvcUtil:

 package com.test;

//imports here

@WebService(targetNamespace = "com.test")
public class BBAppWebAccess {
    @WebMethod
    @WebResult(targetNamespace="com.test.poi")
    public POI getPOI(
            @WebParam(name="ID", targetNamespace="com.test.poi")
            int id) {

        return new POI(id);
    }
}
  

Новое сообщение выглядит следующим образом:

 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <getPOI xmlns="com.test">
            <ID xmlns="com.test.poi">1</ID>
        </getPOI>
    </s:Body>
</s:Envelope>
  

Новый созданный класс getPOI:

 [System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
[System.ServiceModel.MessageContractAttribute(WrapperName="getPOI", WrapperNamespace="com.test", IsWrapped=true)]
public partial class getPOI {

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="com.test.poi", Order=0)]
    public int ID;

    public getPOI() {
    }

    public getPOI(int ID) {
        this.ID = ID;
    }
}
  

Комментарии:

1. Рад, что у вас получилось, вы должны отметить это сообщение как ответ.

Ответ №2:

Похоже, вы отправляете службе неправильный тип (я предполагаю это, поскольку в ошибке указано, что был найден неожиданный элемент ‘ID’, и это означает, что ваш запрос сформирован неправильно). Используйте fiddler (если возможно), чтобы увидеть, что вы отправляете на сервер. Вероятно, вам удастся выяснить, что происходит, а затем вы сможете обновить сгенерированный код, чтобы был отправлен правильный тип.

Комментарии:

1. Я добавил оба сообщения, записанные с помощью Fiddler выше, единственное отличие заключается в пространстве имен, и я не знаю, как это исправить

2. Не могли бы вы, пожалуйста, опубликовать определение класса getPOI.

3. Код добавлен, я надеюсь, вы сможете мне помочь.

4. Сработает ли это, если удалить пространство имен оболочки в атрибуте MessageContractAttribute? Если нет, пожалуйста, опубликуйте вывод fiddler.

5. Значит, после удаления пространства имен оболочки вы все еще получаете <getPOI xmlns=»com.test»> в запросе?? Вам нужно корректировать атрибуты до тех пор, пока либо элемент не будет квалифицирован (как в другом примере), либо пространство имен вообще не исчезнет (<getPOI>). Проблема с запросом заключается в том, что пространство имен не определено, поэтому элемент ID автоматически попадает в пространство имен com.test вместо того, чтобы быть неквалифицированным. Попробуйте присвоить пространству имен оболочки пустую строку (или члену пространства имен атрибута MessageBodyMemberAttribute в свойстве ID).