Java Webservice возвращает нулевой объект клиенту .net - PullRequest
5 голосов
/ 01 июля 2010

Может ли кто-нибудь выяснить, в чем заключается моя проблема ...

Я вызываю веб-метод Java Webservice (Axis 1.4) из .Net-клиента.Этот метод возвращает объект Map, и если я вызываю его из клиента Axis, он работает нормально, но в моем коде на c # он всегда равен нулю.

Это WSDL:

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="urn:http.service.enlaces.portlet.ext.com" xmlns:intf="urn:http.service.enlaces.portlet.ext.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="http://model.enlaces.portlet.ext.com" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:http.service.enlaces.portlet.ext.com">

<wsdl:types>

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://xml.apache.org/xml-soap">
<import namespace="urn:http.service.enlaces.portlet.ext.com"/>
<import namespace="http://model.enlaces.portlet.ext.com"/>
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="mapItem">
   <sequence>
 <element name="key" nillable="true" type="xsd:anyType"/>
 <element name="value" nillable="true" type="xsd:anyType"/>
   </sequence>
</complexType>
<complexType name="Map">
   <sequence>
   <element maxOccurs="unbounded" minOccurs="0" name="item" type="apachesoap:mapItem"/>
   </sequence>
</complexType>   
</schema>
 </wsdl:types>

<wsdl:message name="getFoldersAndBookmarksRequest" />
<wsdl:message name="getFoldersAndBookmarksResponse">
    <wsdl:part name="getFoldersAndBookmarksReturn" type="apachesoap:Map" />
</wsdl:message>

<wsdl:portType name="BookmarksEntryServiceSoap">
<wsdl:operation name="getFoldersAndBookmarks">
      <wsdl:input name="getFoldersAndBookmarksRequest"  message="intf:getFoldersAndBookmarksRequest" />
      <wsdl:output name="getFoldersAndBookmarksResponse" message="intf:getFoldersAndBookmarksResponse" />
    </wsdl:operation>
  </wsdl:portType>

<wsdl:binding name="Portlet_Bookmarks_BookmarksEntryServiceSoapBinding" type="intf:BookmarksEntryServiceSoap">
    <wsdlsoap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc" />
  <wsdl:operation name="getFoldersAndBookmarks">
      <wsdlsoap:operation soapAction="" />
      <wsdl:input name="getFoldersAndBookmarksRequest">
        <wsdlsoap:body use="encoded" namespace="urn:http.service.enlaces.portlet.ext.com" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
      </wsdl:input>
      <wsdl:output name="getFoldersAndBookmarksResponse">
        <wsdlsoap:body use="encoded" namespace="urn:http.service.enlaces.portlet.ext.com" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
      </wsdl:output>
    </wsdl:operation>
</wsdl:binding>

имой сгенерированный код c #:

[System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="urn:http.service.enlaces.portlet.ext.com", ResponseNamespace="urn:http.service.enlaces.portlet.ext.com")]
[return: System.Xml.Serialization.SoapElementAttribute("getFoldersAndBookmarksReturn")]
public Map getFoldersAndBookmarks() {
    object[] results = this.Invoke("getFoldersAndBookmarks", new object[0]);
    return ((Map)(results[0]));
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.SoapTypeAttribute(Namespace="http://xml.apache.org/xml-soap")]
public partial class Map {

    private mapItem[] itemField;

    /// <comentarios/>
    public mapItem[] item {
        get {
            return this.itemField;
        }
        set {
            this.itemField = value;
        }
    }
}

Я, к сожалению, повсюду видел, я не нашел решения.Пожалуйста, есть кто-нибудь, кто знает это?

Ответы [ 5 ]

1 голос
/ 20 ноября 2015

Так что очень поздно помогать вам, но я недавно столкнулся с той же проблемой.

Во-первых, я использую Eclipse для создания веб-службы. Проблема для меня заключалась в том, что сгенерированный wsdd использовал стиль document / literal (wrapped). Изменение этого значения на «RPC» решило проблему. Нет больше нулей.

Так что, может быть, если вы измените кодировку на RPC, это может решить и вашу проблему.

0 голосов
/ 02 ноября 2017

Я столкнулся с той же проблемой.Мое решение состоит в том, чтобы удалить пространство имен в автоматически сгенерированной функции.Это моя функция:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.service-now.com/incident/getRecords", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
[return: System.Xml.Serialization.XmlArrayAttribute("getRecordsResponse", Namespace = "")]
[return: System.Xml.Serialization.XmlArrayItemAttribute("getRecordsResult", Form = System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable = false)]
public getRecordsResponseGetRecordsResult[] getRecords([System.Xml.Serialization.XmlElementAttribute("getRecords", Namespace = "http://www.service-now.com/incident")] getRecords getRecords1)
{
    object[] results = this.Invoke("getRecords", new object[] {
                getRecords1});
    return ((getRecordsResponseGetRecordsResult[])(results[0]));
}

Я удалил пространство имен в этой строке.Поскольку, когда я тестировал веб-сервис через SoapUI, я понял, что у объекта ответа нет пространства имен.Но автоматически сгенерированный код имеет пространство имен.

[return: System.Xml.Serialization.XmlArrayAttribute("getRecordsResponse", Namespace = "")]

Ответ SoapUI был следующим:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <SOAP-ENV:Body>
      <getRecordsResponse>
         <getRecordsResult>
            <active>0</active>
         </getRecordsResult>
      </getRecordsResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

0 голосов
/ 25 сентября 2017

Я столкнулся с этим, и мне пришлось изменить файл WSDL так:

<wsdlsoap:body use="encoded" ... 

до

<wsdlsoap:body use="literal" ... 

Только для генерации прокси.

0 голосов
/ 24 марта 2011

Я столкнулся с той же проблемой некоторое время назад.Это происходит, когда вы пытаетесь получить массив элементов через веб-сервис оси с клиентом .net.

Проблема в том, что " name = item " часть этой строки:

<element maxOccurs="unbounded" minOccurs="0" name="item" type="apachesoap:mapItem"/>

Попробуйте изменить в этой строке «item» на «mapItem».Попробуйте один из них:

<element maxOccurs="unbounded" minOccurs="0" name="mapItem" type="apachesoap:mapItem"/>

или

<element maxOccurs="unbounded" minOccurs="0" name="key" type="apachesoap:mapItem"/>

или

<element maxOccurs="unbounded" minOccurs="0" name="value" type="apachesoap:mapItem"/>
0 голосов
/ 02 февраля 2011

И вот почему веб-сервисы, сгенерированные из кода, почти никогда не взаимодействуют:)

Один хороший способ обойти это - сначала создать wsdl и определить немного ясного XSD, который должен хорошо отображаться как в .Net, так и в java. Альтернатива - это что-то иное, чем ось 1.4 (да, боль) для сервера, если у вас есть какой-то контроль над этим.

Наконец, попробуйте массировать подписи в коде Java, попробуйте заменить List на MapItem [], или наоборот, убедитесь, что у вас нет Map нигде в возвращаемом объекте или параметре.

Повторно просматривая ваш сгенерированный wsdl, я бы сказал, что это, возможно, из-за xsd: anyType для части ключ / значение mapItem.

Я думаю, это то, что генерируется осью, если у вас есть Java-объект в параметре. Поверь мне, ты не хочешь этого. Сделайте это строкой, или сложным типом, или целым числом, но объект может подразумевать только открытый конец xml (xsd: anyType) и не так много клиентов, как это анализировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...