В чем проблема с этим методом веб-службы? - PullRequest
3 голосов
/ 23 декабря 2009

Обновление: Проблема решена .


Мне нужно вызвать метод веб-службы (dduLogin), который возвращает 3 параметра. Я сгенерировал код, «добавив веб-ссылку» через visual studio. Это соответствующая часть WSDL:

<message name="dduLoginRequest">
    <part name="Ticket" type="xsd:string"/>
    <part name="ServiceId" type="xsd:string"/>
    <part name="Market" type="xsd:string"/>
    <part name="Application" type="xsd:string"/>
    <part name="Brand" type="xsd:string"/>
    <part name="Sincom" type="xsd:string"/>
    <part name="CertificationSystem" type="xsd:string"/>
</message>  


<message name="dduLoginResponse">
    <part name="Ticket" type="xsd:string"/>
    <part name="LoginId" type="xsd:string"/>
    <part name="Return" type="xsd:string"/>
</message>
<portType name="dduPortType">
    <operation name="dduLogin">
        <input message="tns:dduLoginRequest"/>
        <output message="tns:dduLoginResponse"/>
    </operation>


</portType>
<binding name="dduBinding" type="tns:dduPortType">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="dduLogin">
        <soap:operation soapAction="urn:ddu#dduLogin" style="rpc"/>
        <input>
            <soap:body use="encoded" namespace="urn:ddu" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
        </input>
        <output>
            <soap:body use="encoded" namespace="urn:ddu" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
        </output>
    </operation>


</binding>

Возможно вызвать этот метод, и это XML, который возвращается:

<SOAP-ENV:Body><ns1:dduLoginResponse xmlns:ns1="urn:ddu">
    <Ticket xsi:type="xsd:string">M-S%40%2AT6%2F%26179G%23%24%25%25%2A%40%40LDNT%27BP%3F9C%2CRY9-Z8C0C%3D0JXD%24_%2A%5EFKF%26DV%3BIP_8%3DM.E3VBDU7%3CAB%5C9_%22%3A%29E9%2CYO6%5C8I%5D6J%5EZ%60%2C8%3A%26%60%25U%3B.6A4G%2BO%5EQA%5DINI4X2%247%29M%2C%3B%3DZ%5CQ%3C%3A%27%3AB%5CSUB%3F9GAPC%3DRV%3CA%5E%2CE7%40L3%3F%3FY%215T%27%40B%3FKUJIH%3D%2B150Q%3CD%3A%3B%21D%22%3B%3ED%60%60%0A</Ticket>
    <LoginId xsi:type="xsd:string">22459</LoginId>
    <Return xsi:type="xsd:string">0</Return></ns1:dduLoginResponse>
</SOAP-ENV:Body>

Но после вызова не все возвращаемые значения заполняются должным образом. Это код, сгенерированный Visual Studio для этого метода:

[System.Web.Services.Protocols.SoapRpcMethodAttribute("urn:ddu#dduLogin", RequestNamespace="urn:ddu", ResponseNamespace="urn:ddu")]
[return: System.Xml.Serialization.SoapElementAttribute("LoginId")]
public string dduLogin(ref string Ticket, string ServiceId, string Market, string Application, string Brand, string Sincom, string CertificationSystem, out string Return) {
    object[] results = this.Invoke("dduLogin", new object[] {
        Ticket,
        ServiceId,
        Market,
        Application,
        Brand,
        Sincom,
        CertificationSystem});
    Ticket = ((string)(results[1]));
    Return = ((string)(results[2]));
    return ((string)(results[0]));
}

Это похоже на результаты в неправильном порядке (тикет должен быть results[0]), а LoginId должен быть results[1], а results[1] также пуст (ноль).

В чем здесь проблема? Я что-то пропустил? Это плохой WSDL? Это генератор прокси веб-службы Visual Studio? У кого-то было это раньше? Любые предложения о том, как решить эту проблему?

Кстати, коллега может успешно вызывать этот веб-сервис, используя другой набор инструментов веб-сервиса (абсолютно не связанный с .NET).

Редактировать : вот вывод из wsdl.exe для рассматриваемого wsdl:

C:\temp>wsdl https://eu.link.fiatauto.com/tsi/DDUWsAut.php?wsdl
Microsoft (R) Web Services Description Language Utility
[Microsoft (R) .NET Framework, Version 2.0.50727.3038]
Copyright (C) Microsoft Corporation. All rights reserved.
Warning: This web reference does not conform to WS-I Basic Profile v1.1.
R2706: A wsdl:binding in a DESCRIPTION MUST use the value of "literal" for the u
se attribute in all soapbind:body, soapbind:fault, soapbind:header and soapbind:
headerfault elements.
  -  Input element soapbind:body of operation 'dduLogin' on portType 'dduBinding
' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduLogin' on portType 'dduBindin
g' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduLogout' on portType 'dduBindin
g' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduLogout' on portType 'dduBindi
ng' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduDir' on portType 'dduBinding'
from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduDir' on portType 'dduBinding'
 from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduGetGroupList' on portType 'ddu
Binding' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduGetGroupList' on portType 'dd
uBinding' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduGetGroupFileList' on portType
'dduBinding' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduGetGroupFileList' on portType
 'dduBinding' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduCreate' on portType 'dduBindin
g' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduCreate' on portType 'dduBindi
ng' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduOpen' on portType 'dduBinding'
 from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduOpen' on portType 'dduBinding
' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduClose' on portType 'dduBinding
' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduClose' on portType 'dduBindin
g' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduAbort' on portType 'dduBinding
' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduAbort' on portType 'dduBindin
g' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduRead' on portType 'dduBinding'
 from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduRead' on portType 'dduBinding
' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduWrite' on portType 'dduBinding
' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduWrite' on portType 'dduBindin
g' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduGet' on portType 'dduBinding'
from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduGet' on portType 'dduBinding'
 from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduPost' on portType 'dduBinding'
 from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduPost' on portType 'dduBinding
' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduGetAtt' on portType 'dduBindin
g' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduGetAtt' on portType 'dduBindi
ng' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduPostAtt' on portType 'dduBindi
ng' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduPostAtt' on portType 'dduBind
ing' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduTransaction' on portType 'dduB
inding' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduTransaction' on portType 'ddu
Binding' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduCommit' on portType 'dduBindin
g' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduCommit' on portType 'dduBindi
ng' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduRollback' on portType 'dduBind
ing' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduRollback' on portType 'dduBin
ding' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduLoginDescr' on portType 'dduBi
nding' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduLoginDescr' on portType 'dduB
inding' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduIsRemoteDebug' on portType 'dd
uBinding' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduIsRemoteDebug' on portType 'd
duBinding' from namespace 'urn:ddu'.
  -  Input element soapbind:body of operation 'dduLogClient' on portType 'dduBin
ding' from namespace 'urn:ddu'.
  -  Output element soapbind:body of operation 'dduLogClient' on portType 'dduBi
nding' from namespace 'urn:ddu'.

For more details on the WS-I Basic Profile v1.1, see the specification
at http://www.ws-i.org/Profiles/BasicProfile-1.1.html.

Writing file 'C:\temp\ddu.cs'.

Обновление

Я следовал @ 1036 * совету Бенджамина и использовал WCF для создания клиента. У меня действительно были некоторые проблемы: wsdl содержал некоторые пробелы, где не должно быть пробелов, и кодировка службы, очевидно, была ISO-8859-1, поэтому я в итоге создал свой собственный CustomTextMessageEncoder .

Поскольку я ожидаю новых проблем в будущем с этим сервисом, я все еще очень заинтересован в том, чтобы заставить его работать со ссылками на веб-сервисы старого стиля, так что если у кого-то есть другая подсказка, почему возвращаемый xml не анализируется правильно вот URL к wsdl:

https://eu.link.fiatauto.com/tsi/DDUWsAut.php?wsdl

Обратите внимание, что удаление пробелов (с которыми я столкнулся при попытке справочного обслуживания службы) не решило эту проблему (вывод файла wsdl.exe остался прежним без пробелов).

Ответы [ 3 ]

1 голос
/ 23 декабря 2009

Вы можете попробовать использовать инструмент wsdl.exe для создания файла класса прокси, а не «Добавить ссылку». Если у вас возникла та же проблема с отсутствующими возвращаемыми значениями при использовании прокси-класса, вы можете попробовать отредактировать файл прокси-класса вручную, чтобы решить вашу проблему.

wsdl.exe http://msdn.microsoft.com/en-us/library/7h3ystb6%28VS.80%29.aspx

Ваша проблема может быть аналогична проблеме, описанной в этом сообщении в блоге. http://blogs.msdn.com/eugeneos/archive/2007/02/05/solving-the-disappearing-data-issue-when-using-add-web-reference-or-wsdl-exe-with-wcf-services.aspx

1 голос
/ 22 января 2010

Я поднял вопрос с провайдером службы, и после некоторого устранения неполадок (они не смогли сначала воспроизвести его) стало ясно, что для одной и той же службы, по-видимому, есть 2 разные конечные точки:

По умолчанию, который я использовал:

https://eu.link.fiatauto.com/tsi/DDUWsAut.php

и еще один, который они использовали (очевидно, специально для клиентов dotnet):

https://eu.link.fiatauto.com/tsi/DDUWsAutDotNet.php

Почему это будет необходимо, мне пока неясно, но использование конкретной конечной точки dotnet вместо другой решило мою проблему, поэтому я не задавал дополнительных вопросов.

1 голос
/ 23 декабря 2009

У меня были похожие проблемы, и они исчезли, когда я использовал WCF (т.е. Добавить ссылку на службу вместо веб-ссылки) для генерации прокси-классов.

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