Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SOAP 1.2 yields bad request while SOAP 1.1 works

I have created an ASP.NET webservice (asmx) to allow 3rd party software to connect to my solution. The webservice works well when called using SOAP 1.1 or via ASP.NET's invocation form when called from the server on which it resides.

So what's the problem, the connecting party only supports SOAP 1.2, when calling the webservice using SOAP 1.2 it returns 400 Bad request.

I have enabled SOAP 1.2 in the web.config:

<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>

I use the extension for another part, I've tried to disable it through location-specific configuration but that did not yield any results.

I have enabled tracing:

<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>

Using the Chrome Advanced Rest Client I send the following request:

<?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>

Which results in a 400 Bad Request and the following entry in the trace log:

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

I've googled to near insanity but unfortunately I haven't been able to find a solution.

Any help is very much appreciated.

EDIT:

Unfortunately rAhuID's suggestion te remove SOAP 1.1 support this did not solve the problem. I went on and tried a bit more option such as clearing all protocols and adding only HttpSoap12 and Documentation which appears to make matters worse. I then removed all protocols that are not required. The XmlException is gone from the logs but I still get a 400 Bad request :(

I've tested from the local machine (using the hosts file so I can use the correct hostname) to rule out the proxyserver as an issue.

Currrent web.config:

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

Diagnostics:

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
like image 777
KvH Avatar asked May 22 '14 13:05

KvH


2 Answers

Try specifying "AnyHttpSoap" instead of "HttpSoap12".

Or as you said, if they only support 1.2, then instead of adding "HttpSoap12", just remove "HttpSoap" from protocol.

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

This might help.

like image 92
rAhulD Avatar answered Nov 03 '22 22:11

rAhulD


Thanx a bunch for your help.

I've created a small test-website and found that SOAP 1.2 worked with the default configuration. I gaduately added configuration with the goal of mirroring the real config.

Doing this I found that the SOAP extension caused the problem. If anyone experiences the same issues, it is possible to enable the extension for a specific location, but impossible to disable for a specific location.

The resulting (working) configuration is as follows:

<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>

Thanks for your much appreciated help!

like image 22
KvH Avatar answered Nov 03 '22 23:11

KvH