2014-05-22 14 views
6

Utworzono usługę sieciową ASP.NET (asmx), aby umożliwić oprogramowaniu innej firmy połączenie z moim rozwiązaniem. Usługa działa dobrze po wywołaniu przy użyciu SOAP 1.1 lub poprzez formularz wywołania ASP.NET, gdy zostanie wywołana z serwera, na którym się znajduje.SOAP 1.2 daje złe żądanie, podczas gdy SOAP 1.1 działa

Więc na czym polega problem, strona łącząca obsługuje tylko SOAP 1.2, podczas wywoływania usługi internetowej przy użyciu SOAP 1.2 zwraca 400 Złe żądanie.

mam włączone SOAP 1.2 w pliku 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> 

używam rozszerzenia do innej części, starałem się go wyłączyć poprzez konfigurację konkretnej lokalizacji, ale to nie przyniosło żadnych rezultatów.

mam włączone śledzenie:

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

Korzystanie klienta Chrome zaawansowane Resztę wysłać następującą prośbę:

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

co skutkuje 400 Bad Request i dodaje się wpis w dzienniku śledzenia :

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 

Mam googled do blisko szaleństwa, ale niestety nie byłem abl e znaleźć rozwiązanie.

Każda pomoc jest bardzo doceniana.

EDIT:

Niestety propozycja rAhuID za te usunąć mydłem 1.1 wsparcie to nie rozwiązuje problemu. Kontynuowałem i próbowałem nieco więcej opcji, takich jak czyszczenie wszystkich protokołów i dodawanie tylko HttpSoap12 i Dokumentacji, co wydaje się pogarszać sprawę. Następnie usunąłem wszystkie protokoły, które nie są wymagane. Wyjątek XmlException zniknął z dzienników, ale nadal dostaję 400 nieprawidłowych żądań :(

Przetestowałem na komputerze lokalnym (używając pliku hosts, aby można było użyć poprawnej nazwy hosta), aby wykluczyć serwer proxy jako 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> 

Diagnostyka:.

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

Dziękuję bardzo, właśnie uratowałeś mi wiele frustracji! – mrexodia

Odpowiedz

1

Niż kilka za pomoc.

Stworzyłem małą witrynę testową i okazało się, że SOAP 1.2 działa z domyślną konfiguracją. Dodałem do niego konfigurację z myślą o odzwierciedleniu prawdziwej konfiguracji.

W ten sposób stwierdziłem, że rozszerzenie SOAP spowodowało problem. Jeśli ktoś ma takie same problemy, możliwe jest włączenie rozszerzenia dla określonej lokalizacji, ale niemożliwe do wyłączenia dla określonej lokalizacji.

Otrzymany (pracy) konfiguracja jest następująca:

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

Dzięki za bardzo doceniane pomoc!

1

Spróbuj określenie "AnyHttpSoap" zamiast "HttpSoap12"

Albo, jak powiedziałeś, jeśli obsługują tylko 1.2, zamiast dodawać "HttpSoap12", po prostu usuń "HttpSoap" z protokołu.

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

This może pomóc.

+0

Dzięki za odpowiedź, niestety problem nie został rozwiązany za pomocą tej metody, zmodyfikowałem pytanie, wprowadzając dodatkowe dane na podstawie Twojej odpowiedzi. – KvH

0

strona Klient powinien określić działania w sekcji nagłówka, to jak to się robi w PHP ("to" jest SoapClient)

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

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

Nadzieja to pomaga