【问题标题】:SOAP 1.2 yields bad request while SOAP 1.1 worksSOAP 1.2 产生错误请求,而 SOAP 1.1 工作
【发布时间】:2014-05-22 13:45:18
【问题描述】:

我创建了一个 ASP.NET 网络服务 (asmx) 以允许第 3 方软件连接到我的解决方案。 当使用 SOAP 1.1 或通过 ASP.NET 的调用表单从它所在的服务器调用时,该 Web 服务运行良好。

那么问题来了,连接方只支持 SOAP 1.2,当使用 SOAP 1.2 调用 webservice 时返回 400 Bad request。

我在 web.config 中启用了 SOAP 1.2:

<configuration>
    <system.web>
        <webServices>
            <soapExtensionTypes>
                <add type="Microsoft.Web.Services2.WebServicesExtension, Microsoft.Web.Services2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority="1" group="0" />
            </soapExtensionTypes>
            <protocols>
                <add name="HttpSoap12" />
                <add name="HttpGet" />
                <add name="HttpPost" />
            </protocols>
        </webServices>
    </system.web>
</configuration>

我将扩展用于另一部分,我尝试通过特定位置的配置禁用它,但没有产生任何结果。

我已启用跟踪:

<system.diagnostics>
    <trace autoflush="true" />
    <sources>
        <source name="System.Web.Services.Asmx">
            <listeners>
                <add name="AsmxTraceFile" type="System.Diagnostics.TextWriterTraceListener" initializeData="D:\Trace.log" traceOutputOptions="LogicalOperationStack, DateTime, Timestamp, ProcessId, ThreadId" />
            </listeners>
        </source>
    </sources>
    <switches>
        <add name="System.Web.Services.Asmx" value="Verbose"  />
    </switches>
</system.diagnostics>

使用 Chrome Advanced Rest Client 我发送以下请求:

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <authenticateUser xmlns="http://services.kvh.nl/foo">
      <username>kvh</username>
      <password></password>
    </authenticateUser>
  </soap12:Body>
</soap12:Envelope>

这会导致 400 Bad Request 和跟踪日志中的以下条目:

System.Web.Services.Asmx Information: 0 : Calling IHttpHandlerFactory.GetHandler
    Caller: System.Web.Services.Protocols.WebServiceHandlerFactory#6565889::GetHandler()
    Request Host Address: 10.1.1.8
    Request Host Name: lb03.kvh.local
    Request Url: [POST] http://services.kvh.nl/Services/MyWebservice.asmx
    ProcessId=11272
    LogicalOperationStack=
    ThreadId=6
    DateTime=2014-05-22T13:28:45.1166408Z
    Timestamp=9623920014337
System.Web.Services.Asmx Information: 0 : Calling XmlSerializer [Create XmlSerializer]
    Method: System.Xml.Serialization.XmlSerializer#1912278872::FromMappings(System.Xml.Serialization.XmlMapping[]#40573663=[24], System.Security.Policy.Evidence#667347099=..)
    Caller: System.Web.Services.Protocols.SoapServerType#31148249::.ctor(WWW.Services.MyWebservice#477438864=WWW.Services.MyWebservice, System.Web.Services.Configuration.WebServiceProtocols#63=HttpGet, HttpPost, Documentation, HttpPostLocalhost, AnyHttpSoap)
    ProcessId=11272
    LogicalOperationStack=
    ThreadId=6
    DateTime=2014-05-22T13:28:45.1478409Z
    Timestamp=9623920106472
System.Web.Services.Asmx Information: 0 : Return from XmlSerializer [Create XmlSerializer]
    Caller: System.Web.Services.Protocols.SoapServerType#31148249::.ctor(WWW.Services.MyWebservice#477438864=WWW.Services.MyWebservice, System.Web.Services.Configuration.WebServiceProtocols#63=HttpGet, HttpPost, Documentation, HttpPostLocalhost, AnyHttpSoap)
    ProcessId=11272
    LogicalOperationStack=
    ThreadId=6
    DateTime=2014-05-22T13:28:45.3038412Z
    Timestamp=9623920433863
System.Web.Services.Asmx Information: 0 : Calling SoapExtension
    Method: Microsoft.Web.Services2.WebServicesExtension#3391963::ProcessMessage(System.Web.Services.Protocols.SoapMessageStage#4=BeforeDeserialize)
    Caller: System.Web.Services.Protocols.SoapServerMessage#31258077::RunExtensions(System.Web.Services.Protocols.SoapExtension[]#34069029=[1], System.Boolean#0=False)
    ProcessId=11272
    LogicalOperationStack=
    ThreadId=6
    DateTime=2014-05-22T13:28:45.3038412Z
    Timestamp=9623920435703
System.Web.Services.Asmx Information: 0 : Return from SoapExtension
    Caller: System.Web.Services.Protocols.SoapServerMessage#31258077::RunExtensions(System.Web.Services.Protocols.SoapExtension[]#34069029=[1], System.Boolean#0=False)
    ProcessId=11272
    LogicalOperationStack=
    ThreadId=6
    DateTime=2014-05-22T13:28:45.3506412Z
    Timestamp=9623920542168
System.Web.Services.Asmx Warning: 0 : Exception caught in System.Web.Services.Protocols.SoapServerProtocolFactory#48477748::Create.
    System.Xml.XmlException: Root element is missing.
    ProcessId=11272
    LogicalOperationStack=
    ThreadId=6
    DateTime=2014-05-22T13:28:45.3506412Z
    Timestamp=9623920545216
System.Web.Services.Asmx Warning: 0 : Exception Details:
System.Xml.XmlException: Root element is missing.
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.ThrowWithoutLineInfo(String res)
   at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.XmlTextReader.Read()
   at System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.Read()
   at System.Xml.XmlReader.MoveToContent()
   at System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.MoveToContent()
   at System.Web.Services.Protocols.SoapServerProtocolHelper.GetRequestElement()
   at System.Web.Services.Protocols.Soap12ServerProtocolHelper.RouteRequest()
   at System.Web.Services.Protocols.SoapServerProtocol.RouteRequest(SoapServerMessage message)
   at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
   at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response)
   at System.Web.Servic...
    ProcessId=11272
    LogicalOperationStack=
    ThreadId=6
    DateTime=2014-05-22T13:28:45.3506412Z
    Timestamp=9623920548659
System.Web.Services.Asmx Error: 0 : Exception thrown in System.Web.Services.Protocols.WebServiceHandlerFactory#6565889::CoreGetHandler().
    System.InvalidOperationException: Failed to handle request.
    ProcessId=11272
    LogicalOperationStack=
    ThreadId=6
    DateTime=2014-05-22T13:28:45.3506412Z
    Timestamp=9623920549597

我已经用谷歌搜索了几近疯狂,但不幸的是我无法找到解决方案。

非常感谢任何帮助。

编辑:

不幸的是,rAhuID 的建议删除 SOAP 1.1 支持这并没有解决问题。我继续尝试了更多选项,例如清除所有协议并仅添加 HttpSoap12 和文档,这似乎使事情变得更糟。然后我删除了所有不需要的协议。 XmlException 已从日志中消失,但我仍然收到 400 Bad request :(

我已经在本地机器上进行了测试(使用主机文件,以便我可以使用正确的主机名)以排除代理服务器的问题。

当前的 web.config:

<protocols>
    <!--
        <clear />
        <add name="Documentation" />
        <add name="HttpSoap12" />
    -->
    <remove name="HttpGet" />
    <remove name="HttpPost" />
    <remove name="HttpPostLocalhost" />
    <remove name="HttpSoap" />
</protocols>

诊断:

System.Web.Services.Asmx Information: 0 : Calling IHttpHandlerFactory.GetHandler
    Caller: System.Web.Services.Protocols.WebServiceHandlerFactory#31931339::GetHandler()
    Request Host Address: 127.0.0.1
    Request Host Name: web01.kvh.nl
    Request Url: [POST] http://services.kvh.nl/services/MyWebservice.asmx
    ProcessId=15596
    LogicalOperationStack=
    ThreadId=10
    DateTime=2014-05-23T11:13:39.7977582Z
    Timestamp=9802327858068
System.Web.Services.Asmx Information: 0 : Calling XmlSerializer [Create XmlSerializer]
    Method: System.Xml.Serialization.XmlSerializer#1912278872::FromMappings(System.Xml.Serialization.XmlMapping[]#53221370=[24], System.Security.Policy.Evidence#656725186=..)
    Caller: System.Web.Services.Protocols.SoapServerType#63548859::.ctor(WWW.Services.MyWebservice#445910576=WWW.Services.MyWebservice, System.Web.Services.Configuration.WebServiceProtocols#40=Documentation, HttpSoap12)
    ProcessId=15596
    LogicalOperationStack=
    ThreadId=10
    DateTime=2014-05-23T11:13:39.8445582Z
    Timestamp=9802327942578
System.Web.Services.Asmx Information: 0 : Return from XmlSerializer [Create XmlSerializer]
    Caller: System.Web.Services.Protocols.SoapServerType#63548859::.ctor(WWW.Services.MyWebservice#445910576=WWW.Services.MyWebservice, System.Web.Services.Configuration.WebServiceProtocols#40=Documentation, HttpSoap12)
    ProcessId=15596
    LogicalOperationStack=
    ThreadId=10
    DateTime=2014-05-23T11:13:39.9849585Z
    Timestamp=9802328272841
System.Web.Services.Asmx Information: 0 : Calling SoapExtension
    Method: Microsoft.Web.Services2.WebServicesExtension#59584177::ProcessMessage(System.Web.Services.Protocols.SoapMessageStage#4=BeforeDeserialize)
    Caller: System.Web.Services.Protocols.SoapServerMessage#64042303::RunExtensions(System.Web.Services.Protocols.SoapExtension[]#63331368=[1], System.Boolean#0=False)
    ProcessId=15596
    LogicalOperationStack=
    ThreadId=10
    DateTime=2014-05-23T11:13:39.9849585Z
    Timestamp=9802328273636
System.Web.Services.Asmx Information: 0 : Return from SoapExtension
    Caller: System.Web.Services.Protocols.SoapServerMessage#64042303::RunExtensions(System.Web.Services.Protocols.SoapExtension[]#63331368=[1], System.Boolean#0=False)
    ProcessId=15596
    LogicalOperationStack=
    ThreadId=10
    DateTime=2014-05-23T11:13:39.9849585Z
    Timestamp=9802328287199
System.Web.Services.Asmx Information: 0 : Calling RouteRequest
    Method: System.Web.Services.Protocols.SoapServerType#63548859::GetMethod(System.String#768149269="http://services.kvh.nl/foo/authenticateUser")
    Caller: System.Web.Services.Protocols.Soap12ServerProtocolHelper#31339276::RouteRequest()
    Request Host Address: 127.0.0.1
    Request Host Name: web01.kvh.nl
    Request Url: [POST] http://services.kvh.nl/services/MyWebservice.asmx
    ProcessId=15596
    LogicalOperationStack=
    ThreadId=10
    DateTime=2014-05-23T11:13:40.0005585Z
    Timestamp=9802328288057
System.Web.Services.Asmx Information: 0 : Return from RouteRequest
    Caller: System.Web.Services.Protocols.Soap12ServerProtocolHelper#31339276::RouteRequest()
    ProcessId=15596
    LogicalOperationStack=
    ThreadId=10
    DateTime=2014-05-23T11:13:40.0005585Z
    Timestamp=9802328288265
System.Web.Services.Asmx Information: 0 : Return from IHttpHandlerFactory.GetHandler
    Caller: System.Web.Services.Protocols.WebServiceHandlerFactory#31931339::GetHandler()
    ProcessId=15596
    LogicalOperationStack=
    ThreadId=10
    DateTime=2014-05-23T11:13:40.0005585Z
    Timestamp=9802328288464

【问题讨论】:

  • 非常感谢,你帮我省了很多麻烦!

标签: asp.net web-services soap


【解决方案1】:

尝试指定“AnyHttpSoap”而不是“HttpSoap12”。

或者如你所说,如果他们只支持 1.2,那么不要添加“HttpSoap12”,只需从协议中删除“HttpSoap”即可。

<protocols>
  <remove name="HttpSoap"/>
</protocols>

This 可能会有所帮助。

【讨论】:

  • 感谢您的回复,很遗憾问题没有通过这种方法解决,我根据您的回答修改了问题并添加了额外的输入。
【解决方案2】:

感谢您的帮助。

我创建了一个小型测试网站,发现 SOAP 1.2 可以使用默认配置。我逐渐添加了配置,目的是镜像真实配置。

这样做我发现 SOAP 扩展导致了问题。 如果有人遇到同样的问题,可以为特定位置启用扩展程序,但无法为特定位置禁用。

结果(工作)配置如下:

<configuration>
    <system.web>
        <webServices>
            <protocols>
                <add name="HttpGet" />
                <add name="HttpPost" />
            </protocols>
        </webServices>
    </system.web>
    <location path="Services/MyOtherWebservice.asmx">
        <system.web>
            <webServices>
                <soapExtensionTypes>
                    <add type="Microsoft.Web.Services2.WebServicesExtension, Microsoft.Web.Services2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority="1" group="0" />
                </soapExtensionTypes>
            </webServices>
        </system.web>
    </location>
</configuration>

非常感谢您的帮助!

【讨论】:

    【解决方案3】:

    客户端应该在 Header 部分指定 Action,这就是它在 PHP 中的完成方式(“this”是一个 SoapClient)

    $headers = array();
    $headers[] = $this->generateWSSecurityHeader();
    $headers[] = new SoapHeader('http://www.w3.org/2005/08/addressing', 'Action', $actionService . $function_name, false);          
    $this->__setSoapHeaders($headers);
    

    请求 XML:

    <?xml version="1.0"?>
    <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://tempuri.org/" xmlns:ns2="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:ns3="http://www.w3.org/2005/08/addressing">
        <env:Header>
            <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" env:mustUnderstand="true">
                <wsse:UsernameToken wsu:Id="UsernameToken-2">
                    <wsse:Username>someusername</wsse:Username>
                    <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">123456</wsse:Password>
                    <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">ffe276c004cfca769fcd90d719037bf7f3b182a1</wsse:Nonce>
                </wsse:UsernameToken>
            </wsse:Security>
            <ns3:Action>http://tempuri.org/IBusXmlService/FindBusStops</ns3:Action>
        </env:Header>
        <env:Body>
            <ns1:FindBusStops/>
        </env:Body>
    </env:Envelope>
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多