C# volání WS přes SAP SOAP 1.1 rubrika: Programování: .Net

2 petrf
položil/-a 22.10.2018

Ahoj

Potřeboval bych postrčit s WS SOAP dotazem. Mám program v C#, který volá WS. Základní dotaz, který funguje bez SAP obálky dobře, ale s ní ne. Základem je třída BasicHttpBinding:

BasicHttpBinding binding = new BasicHttpBinding();
EndpointAddress epAddr = new EndpointAddress(endpointAddress);
DataClient proxy = new DataClient(binding, epAddr);
...

Volání služby končí chybou:

There was a communication problem. Záhlaví ReliableMessaging z oboru názvů <a href="http://sap.com/xi/XI/Message/30" title="http://sap.com/xi/XI/Message/30">http://sap.com/xi/XI/Message/30</a> příjemce této zprávy neporozuměl a zpráva proto nebyla zpracována.
Tato chyba obvykle udává, že odesílatel zprávy povolil komunikační protokol, který příjemce nemůže zpracovat. Zkontrolujte, zda je konfigurace klientovy vazby konzistentní s vazbou služby.

Dočetl jsem se, že ReliableMessaging je podporován třídou WSHttpBinding, proto jsem ji použil jaki druhý pokus:

WSHttpBinding binding = new WSHttpBinding();
EndpointAddress epAddr = new EndpointAddress(endpointAddress);
DataClient proxy = new DataClient(binding, epAddr);
...

Volání služby opět končí chybou, ale jinou:

There was a communication problem. Typ obsahu text/html; charset=iso-8859-1 zprávy odpovědi neodpovídá typu obsahu vazby (application/soap+xml; charset=utf-8).
Používáte-li vlastní kodér, ujistěte se, že je metoda IsContentTypeSupported správně implementována. První 516 bajty odpovědi byly: <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Body>
    <soap:Fault>
      <soap:Code>
        <soap:Value>Server</soap:Value>
      </soap:Code>
      <soap:Reason>
        <!--1 or more repetitions:-->
        <soap:Text xml:lang="en">Missing operation for soapAction [null] and body element [{http://schemas.xmlsoap.org/ws/2005/02/trust}RequestSecurityToken] with SOAP Version [SOAP 1.2]</soap:Text>
      </soap:Reason>
    </soap:Fault>
  </soap:Body>
</soap:Envelope>.

V tomto případě je problém, že se volání provádí pomocí SOAP 1.2 a ne dle očekávaného volání SOAP 1.1.

Nevíte prosím vás někdo, jak správně zavolat webovou službu tak, aby podporovala ReliableMessaging a současně byla verze SOAP 1.1?

Děkuji
Petr

odkaz Vyřešeno
9 Petr Voneš
odpověděl/-a 22.10.2018
 
upravil/-a 22.10.2018

Zaměřil bych se na importované proxy třídy. Za prvé je dobré nepoužívat na to Visual Studio (Add Service Reference), protože to vygeneruje spoustu zbytečného balastu. Přitom stačí jen ten jeden .cs soubor. Použij svcutil z Visual Studio Command Prompt a parametr: /serializer:XmlSerializer

Pokud jde o nějakou nestandardní kombinaci jako je použítí WS-* služeb a SOAP 1.1, pak je třeba WCF Custom Binding https://stackoverflow.com/a/5418950

Komentáře

  • petrf : Díky za tip. Custom Binding jsem zkoušel, ale zatím se mi to nepodařilo nastavit, tak aby to fungovalo. svcutils vyzkouším a dám vědět. 22.10.2018
  • Petr Voneš : Jak přesně vypadá WSDL? 23.10.2018
  • harrison314 : Imho, mne sa este nestalo, ze by mi Visual Studio vygenerovalo nieco zle, pokial sa nejdnalo o WSDL-ko, ktore bolo polepene stringami. Potom bola este vynimka, ked slo o nejaky stary format co v podstate ani nebolo SOAP, vtedy som si vygenerovane triedy musel poupravovat. 23.10.2018
  • Petr Voneš : Na některých platformách (čti PHP) neumí WSDL vůbec vygenerovat, takže jej píší ručně v textovém editoru :-) 23.10.2018
  • petrf : Vyzkoušel jsem svcutil s parametrem /serializer:XmlSerializer i bez něj a vygeneruje to naprosto stejné soubory. Soubor vygenerovaný pomocí svcutil má 1215 řádek a soubor pomocí "Add Service Reference" má 1291, takže rozdíl je takřka nulový. To jen k porovnání dvou metod, obsahově si myslím, že se to také neliší. Jinak se mi nepodařilo zprovoznit službo pomocí standardního volání s použitím CustomBindig. Vyzkoušel jsem přes 40 různých nastavení, ale přes SAP obálku jsem se neprokousal. Vzdal jsem to. Program jsem nakonec zprovoznil pomocí třídy HttpWebRequest. Je to sice trochu "drbačka", ale chodí to a už se s tím nemusím trápit. V každém případě bych chtěl poděkovat za pomoc, sice nemusí vést ke zdaru, ale může se hodit jindy a pomoc, ta vždycky potěší... 25.10.2018

Pro plný přístup na Devel.cz se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.