2014-05-22 14 views
6

Ich habe einen ASP.NET-Webdienst (asmx) erstellt, damit Drittanbietersoftware eine Verbindung zu meiner Lösung herstellen kann. Der Webservice funktioniert gut, wenn er über SOAP 1.1 oder über das ASP.NET-Aufrufformular aufgerufen wird, wenn er von dem Server aufgerufen wird, auf dem er sich befindet.SOAP 1.2 führt zu einer fehlerhaften Anforderung, während SOAP 1.1 funktioniert

Also, was ist das Problem, die Verbindungspartei unterstützt nur SOAP 1.2, beim Aufruf des Webservice mit SOAP 1.2 400 Schlechte Anfrage zurückgibt.

Ich habe SOAP 1.2 in der web.config aktiviert:

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

Ich benutze die Erweiterung für einen anderen Teil habe ich versucht, es durch standortspezifische Konfiguration zu deaktivieren, aber das brachte keine Ergebnisse.

Ich habe aktiviert 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> 

die Chrome erweiterte REST-Client verwendet ich folgende Anfrage senden:

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

, die in einem 400 Bad Request führt und der folgende Eintrag in dem Trace-Protokoll :

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 

Ich habe in der Nähe von Wahnsinn gegoogled, aber leider habe ich nicht abl e um eine Lösung zu finden.

Jede Hilfe wird sehr geschätzt.

EDIT:

Leider rAhuID Vorschlag te entfernen SOAP 1.1-Unterstützung das Problem nicht lösen. Ich fuhr fort und probierte ein bisschen mehr Option wie das Löschen aller Protokolle und das Hinzufügen nur von HttpSoap12 und Dokumentation, die das Problem noch verschlimmern. Ich habe dann alle Protokolle entfernt, die nicht benötigt werden. Die XmlException ist aus den Protokollen verschwunden, aber ich bekomme immer noch eine 400 Bad-Anfrage :(

Ich habe von der lokalen Maschine getestet (mit der hosts-Datei, damit ich den korrekten Hostnamen verwenden kann), um den Proxyserver als Problem auszuschließen

Currrent web.config.

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

Diagnose:.

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

Vielen Dank, du hast mir gerade eine Menge Frustration erspart! – mrexodia

Antwort

1

Vielen Dank für Ihre Hilfe.

Ich habe eine kleine Test-Website erstellt und festgestellt, dass SOAP 1.2 mit der Standardkonfiguration funktionierte. Ich habe eine Konfiguration mit dem Ziel hinzugefügt, die reale Konfiguration zu spiegeln.

Dadurch habe ich festgestellt, dass die SOAP-Erweiterung das Problem verursacht. Wenn die gleichen Probleme auftreten, ist es möglich, die Erweiterung für einen bestimmten Standort zu aktivieren, aber nicht für einen bestimmten Standort zu deaktivieren.

Die resultierende (Arbeits-) Konfiguration ist wie folgt:

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

Vielen Dank für Ihre sehr geschätzte Hilfe!

1

Try "AnyHttpSoap" statt "HttpSoap12" Angabe

Oder wie Sie sagten, wenn sie nur 1.2 unterstützen, dann entfernen Sie einfach "HttpSoap" aus dem Protokoll, anstatt "HttpSoap12" hinzuzufügen.

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

This könnte helfen.

+0

Danke für deine Antwort, leider wurde das Problem nicht über diese Methode gelöst, ich habe die Frage mit zusätzlichen Eingaben basierend auf deiner Antwort modifiziert. – KvH

0

Client-Seite sollte Aktion in einem Kopfbereich angeben, dann ist dies, wie es in PHP ("this" ist ein Soapclient) getan

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

XML Anfrage:

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

this helps

Verwandte Themen