2


0

クライアントアプリケーションでWCFサービスを利用しています。 クライアントとサーバーの両方の実装を完全に制御できます。 WCF契約には、クライアントから提供される情報を必要とする数百のメソッドがあります。 何百ものメソッドを変更する代わりに、サービスを呼び出すたびにクライアントから特定のデータを送信できる方法はありますか。

クライアントが呼び出しを行う前にプロキシを設定しているときに、プロキシの内部プロパティのどこかにこのデータを格納することができます。 データはサーバーに送信され、サービスメソッド内からOperationContextまたはその他のメモリを調べてこのデータを取得して使用できますか。

何か案は?

3 Answer


1


SOAP Webサービスのように、ヘッダーのようなものが欲しいと思うようです。 私はWCFの専門家ではありませんが、このhttp://geekswithblogs.net/JanS/archive/2008/03/17/automate-passing-valuable-information-in-wcf-headers.aspxはWCFの同等物のように見えます。 。


1


それほど難しいことではありません。 考えられる最善の方法は、BeforeSendRequestメソッドのMessage.HeadersにSOAPヘッダーを追加するIClientMessageInspectorを作成することです。


0


あなたはこれを些細にすることはできません。 それはいくつかの作業がかかります。

SOAPヘッダーは、帯域外のデータをサービスとやり取りするのに最適な方法です。 しかし、あなたはすでにあなたの契約を定義しています、そしてヘッダを追加することは契約を変えるでしょう。

メッセージ規約を使い始める必要があると思います。

元の:

[DataContract]
public class ComplexObject {[DataMember(Name = "Id")] public int Id;

[DataMember]パブリック文字列Name; }

[ServiceContract()]
パブリックインターフェイスIMyContract {void MyOperation(ComplexObject co); }

パブリッククラスMyService:IMyContract {#region IMyContractの実装

public void MyOperation(ComplexObject co){// coを使用する*}

#endregion}

メッセージコントラクトの使用

[DataContract]
public class ComplexObject {[DataMember(Name = "Id")] public int Id;

[DataMember]パブリック文字列Name; }

[DataContract]
パブリッククラスMyHeader {[DataMember]パブリック文字列UserName。

[DataMember] public stringパスワード。 }

[DataContract]
パブリッククラスOutputHeader {[DataMember]パブリック文字列トークン。 }

[MessageContract]
パブリッククラスMyOperationRequest {[MessageHeader] public MyHeader認証;

[MessageBodyMember] public ComplexObject TheObject; }

[MessageContract]
パブリッククラスMyOperationResponse {[MessageHeader] public OutputHeader OutputHeader; }

[ServiceContract()]
パブリックインターフェイスIMyContract {MyOperationResponse MyOperation(MyOperationRequestリクエスト); }

パブリッククラスMyService:IMyContract {public MyOperationResponse MyOperation(MyOperationRequest request){// request.TheObjectを使用します。* // request.Authentication。*も読み取ることができます

新しいMyOperationResponseを返します{OutputHeader = new OutputHeader {Token = "someToken"}}; }}