代码之家  ›  专栏  ›  技术社区  ›  fretje

这个Web服务方法有什么问题?

  •  3
  • fretje  · 技术社区  · 16 年前

    更新: Problem solved .


    我必须调用Web服务方法(ddulogin),它返回3个参数。我通过Visual Studio“添加Web引用”生成了代码。这是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] 结果〔1〕 也是空的(空)。

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

    顺便说一句,同事可以使用另一个Web服务工具集(完全不与.NET相关)成功地调用此Web服务。

    编辑 :下面是有关WSDL的wsdl.exe输出:

    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的输出在没有空格的情况下仍然相同)。

    3 回复  |  直到 12 年前
        1
  •  1
  •   Benjamin Podszun    16 年前

    我也有类似的问题,当我使用wcf(即: 添加服务引用 而不是Web引用)来生成代理类。

        2
  •  1
  •   Jeremy    16 年前

    您可以尝试使用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

        3
  •  1
  •   fretje    12 年前

    我向服务提供商提出了这个问题,经过相当多的故障排除(他们无法首先重现),很明显同一个服务有两个不同的端点:

    我使用的默认值:

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

    另一个是他们使用的(显然是专门针对dotnet客户机的):

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

    为什么需要这样做对我来说仍然不清楚,但是使用特定于dotnet的端点代替另一个端点解决了我的问题,所以我没有提出进一步的问题。

    推荐文章