2017-04-12 10 views
0

WCFサービスに操作(メソッド)があります。操作にはJsonコンテンツのパラメータがあります。このパラメータAuditLineUpdatedModelについてメッセージコンテンツに基づいて異なる操作にWCFサービス呼び出しをリダイレクトする方法

[OperationContract] 
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)] 
string NotifyAuditLineUpdated(AuditLineUpdatedModel notification); 

、Iは、デシリアライゼーションの際にオブジェクトにJSONメッセージをマッピングするDataContractAttributesとDataMemberAttributesを用いて予備definiedクラスを作成しています。

しかし、私はこの問題は、クライアントが、私は、単一のクラス内のすべてのケースを組み合わせることはできません異なるJSONメッセージ構造下の同じフィールド名を有することである持っています。換言すれば、Jsonメッセージは、の異なる構造(値ではない)を有するフィールドを有する。;したがって、私はを別の操作に呼び出すことを試みています。これはJsonメッセージの多様性を満たすことができます。

これまでのところ、私はWCFがサービスレベルでルーティングを提供することを発見しました。オペレーションレベルでコールをルーティングできるかどうか疑問に思う。言い換えれば、私は異なるパラメータ型の2つの操作を持つ単一のサービスを持っています。コールを捕捉してメッセージの内容を確認し、そのメッセージに基づいて適切な操作にコールを誘導することは可能ですか?

あなたの情報をお試しください。WCFのIDispatchMessageInspector(メッセージインスペクタ機能)。メッセージの内容を確認できましたが、宛先(To URI)アドレスをリダイレクトまたは変更できません。 注:さらに、クライアントサービスは2つの異なるケースに対して異なるuri要求を送信することはできません。

+0

- 「宛先をリダイレクトまたは変更することはできません。」 - 理由を教えてください。新しいメッセージタイプを処理する別のサービスがある場合は、そのサービス用の新しいサービスクライアントを作成し、新しいサービスを使用してメッセージを処理し、その結果を元のサービスに返すことができるはずです。 –

+0

こんにちは@KosalaW、次の行を実行しようとすると、エラーrequest.Headers.Add(MessageHeader.CreateHeader( "To"、 "To"、))が表示されます。 エラーメッセージ:封筒のバージョン 'EnvelopeNone(schemas.microsoft.com/ws/2005/05/envelope/none)';メッセージヘッダーの追加をサポートしていません –

+0

下記の私の答えを参照してください。さらに質問がある場合はお知らせください。新しいサービスのヘッダーを追加する必要はありません。あなたは体だけが必要です。 –

答えて

0

これは単なる例です。コードは概念的なものであり、あなたが望むように実装する必要があります。

[OperationContract] 
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)] 
string NotifyAuditLineUpdated(AuditLineUpdatedModel notification); 

// you can host this somewhere else 
[OperationContract] 
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)] 
string MyInternalService(AuditLineUpdatedModel1 notification); 

public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext) 
{ 
    object response; 
    var isCallToMyInternalServiceRequired = VerificationMethod(request, out response); 
    if(!isCallToMyInternalServiceRequired) 
    { 
     using(var client = new NotifyAuditLineUpdatedClient()) 
     { 
      return client.NotifyAuditLineUpdated(response as AuditLineUpdatedModel); 
     } 
    } 

    using(var client = new MyInternalServiceClient()) 
    { 
     return client.MyInternalServiceClient(response as AuditLineUpdatedModel1); 
    } 
} 

private bool VerificationMethod(object notification, out object output) 
{ 
    // your validation method. 
} 
+0

これは私がこれまでに得た最高の答えだと思いますが、この答えを完全なものにしてしまうことがあります。このソリューションを使用すると、私はここで必要なメソッドを呼び出すことができますが、受け取ったリクエストに基づいて名前で呼び出すことができますが、WCFが元のクライアントリクエストメソッドを呼び出すという問題があります。 ? –

関連する問題