0

処理する SOAP メッセージ形式に関して非常に要求の厳しい (標準外の) Web サービスを呼び出さなければなりません。私はサーバー側の実装を制御できず、利用可能な WSDL もありません。私が持っているのは、以下に添付された傍受されたメッセージだけです。

私の最初の考えは WCF+MessageContract でしたが、最後に何をしても、正しい結果が得られないようです。発信メッセージは次のようになります。最もトリッキーな部分は、複数の本文コンテンツ ("ProxyInfo" および "PayloadInfo" 以下) のようです。それに加えて、WCF で SOAP メッセージ ヘッダーから "Action" 要素を削除することもできません。これが WCF にとって不可欠な要素であることは理解していますが、Web サービスにそれを受け入れるよう説得できるかどうかは疑問です。返事はまた別の話になるかもしれませんが、その橋に着いたら渡ります。

現在、カスタムのシリアル化と、送信/受信メッセージの後/前処理を検討しています。最悪の場合、Web リクエストとシリアル化を手動で行う必要があると思います。助けてください、私は本当に必死になっています...

<?xml version="1.0" encoding="UTF-8" ?>
<e:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasisopen.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">
 <e:Header>
  <ServiceHeader xmlns="http://services/serviceheader" e:actor="http://services/loadbalancer" >
   <ServiceLevel>
    <Type>HIGH</Type>
    <Method>FIFO</Method>
   </ServiceLevel>
  </ServiceHeader>
 </e:Header>
 <e:Body>
  <ProxyInfo xmlns="http://services/proxyinfo">
   <Server>
    <Address>proxy1:8080</Address>
    <AppId>case_delegator</AppId>
   </Server>
  </ProxyInfo>
  <PayloadInfo xmlns="http://services/payload">
   <GetConfirmation>
    <CaseId>
     <Id>9728DFC889874CC8B1505D91E33FCFCD</Id>
    </CaseId>
   </GetConfirmation>
  </PayloadInfo>
 </e:Body>
</e:Envelope>
4

1 に答える 1

0

Address ヘッダーを使用したくない場合は、WS-Addressing なしでバインディングを使用する必要があります。あなたの場合、BasicHttpBinding を使用します。WS-Addressing および Action SOAP ヘッダーは使用しませんが、代わりに SOAPAction HTTP ヘッダーを使用します。

メッセージ コントラクトには、次のようなものを使用してみてください。

[DataContract]
public class ServiceHeader
{
  ...
}

[DataContract]
public class ProxyInfo
{
  ...
}

[DataContract]
public class PayloadInfo
{ 
  ...
}

[MessageContract(IsWrapped = false)]
public class Request
{
  [MessageHeader(Namespace="http://services/serviceheader")]
  public ServiceHeader ServiceHeader { get; set; }

  [MessageBodyMember(Namespace="http://services/proxyinfo")]
  public ProxyInfo ProxyInfo { get; set; }

  [MessageBodyMember(Namespace="http://services/payload")]
  public PayloadInfo PayloadInfo { get; set; }
}

奇妙なのは、ServiceHeader のアクター属性です。メッセージはプレフィックス e の名前空間を定義していないため、メッセージは有効な XML ではありません。

于 2010-09-23T07:18:30.000 に答える