gpt4 book ai didi

c# - 这种网络服务方法有什么问题?

转载 作者:行者123 更新时间:2023-11-30 16:35:16 27 4
gpt4 key购买 nike

更新:Problem solved .


我必须调用 Web 服务方法 (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]));
}

好像结果顺序错了(ticket应该是results[0]),LoginId应该是results[1]results[ 1] 也是空的 (null)。

这里有什么问题?我错过了什么吗?这是一个糟糕的wsdl吗?是 Visual Studio Web 服务代理生成器吗?有人以前有过这个吗?关于如何解决这个问题有什么建议吗?

顺便说一句,一位同事能够使用另一个 Web 服务工具集(完全与 .NET 无关)成功调用此 Web 服务。

编辑:这里是 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'.

更新

我关注了@Benjamin's建议,并使用 WCF 创建客户端。不过我确实遇到了一些问题:wsdl 包含一些不应该有空格的空格,而且服务的编码显然是 ISO-8859-1,所以我最终创建了自己的 CustomTextMessageEncoder。 .

因为我预计这项服务会在未来出现更多问题,所以我仍然非常有兴趣让它与旧式 Web 服务引用一起使用,所以如果有人有其他线索为什么返回的 xml 没有被正确解析, 这是 wsdl 的 url:

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

请注意,删除空格(这是我在尝试服务引用方式时遇到的问题)没有解决此问题(wsdl.exe 的输出在没有空格的情况下仍然相同)。

最佳答案

我遇到过类似的问题,当我使用 WCF(即:添加服务引用 而不是 Web 引用)生成代理类时,这些问题就消失了。

关于c# - 这种网络服务方法有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1953132/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com