SOAP 1.2 gives a bad request, while SOAP 1.1 works

I created an ASP.NET web service (asmx) to allow third-party software to connect to my solution. Webservice works well when called using SOAP 1.1 or using the ASP.NET call form when called from the server on which it is located.

So, what a problem, the connection participant only supports SOAP 1.2, when calling a web service using SOAP 1.2, it returns 400 Bad request.

I have included SOAP 1.2 in 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 am using the extension for another part, I tried to disable it through a location-specific configuration, but this did not produce any results.

I turned on 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 submit 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> 

The result is 400 Bad Request and the following trace log entry:

 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 was looking for proximity to craziness, but unfortunately I could not find a solution.

Any help is greatly appreciated.

EDIT:

Unfortunately, the rAhuID suggestion for removing SOAP 1.1 did not help solve this problem. I continued and tried a few more options, such as clearing all protocols and adding only HttpSoap12 and Documentation, which seems to be even worse. Then I deleted all the protocols that are not required. The XmlException has disappeared from the logs, but I still get 400 Bad requests :(

I tested from the local machine (using the hosts file so that I can use the correct host name) to exclude the proxy server as a problem.

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 
+6
source share
3 answers

Thanx bunch for your help.

I created a small test site and found that SOAP 1.2 worked with the default setting. I gaduately added a configuration to mirror the actual configuration.

By doing this, I found that the SOAP extension caused this problem. If anyone is having the same problems, it’s possible to enable the extension for a specific location, but it is not possible to disable it 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> 

Thank you for your greatly appreciated help!

+1
source

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 the protocol.

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

It might help .

+1
source

The client side should indicate the action in the header section, as is done in PHP ("this" is 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 request:

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

Hope this helps

0
source

Source: https://habr.com/ru/post/969701/


All Articles