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
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.
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!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With