2011-09-20 3 views
5

Iveには複数のWebメソッドがあるWCFサービスがあります。私はすべての方法で要求を傍受し、IPアドレスを調べることができるようにしたい。 Idではなく、それぞれのWebメソッドの最上部にあるメソッド呼び出しにロジックを入れないで、これらのメソッドへのすべての呼び出しを1か所から傍受する方法がありますか?WCF .svcサービス内のメソッドへのすべての呼び出しを傍受するにはどうすればよいですか?

もし私が基本ページオブジェクトを書くが、wcf呼び出しで発生したイベントがあるかどうかはわからないページだったら?

+0

WCFの[インスペクタ](https://web.archive.org/web/20120207232924/http://cgeers.com:80/2008/11/09/wcf-extensibility-parameter)のインスペクタを使用できます。 -inspectors /) – dhinesh

+0

@dhineshの上のコメントリンクは、マルウェアのあるページを読み込んでいるようで、Chrome拡張機能をインストールしたいと思っていました。私はモデレータに報告しました。 – Volomike

+0

あなたの質問はasp.netよりはるかに広範で、C#コーダーとVBコーダーにも.NETで非常に便利なので、asp.netタグを削除することをお勧めしたいと思います。 – Volomike

答えて

3

WCFでは、スタックに追加されるインターセプタを実装できます。例としてはlinkを参照してください。私はこれが送信者のIPを抽出することができるかどうかはわかりませんが、試してみる価値はあると思います。

3

IDispatchMessageInspectorを実装して、このようなことを行うことができます。

public object AfterReceiveRequest(ref Message request, 
IClientChannel channel, InstanceContext instanceContext) 
    { 
     RemoteEndpointMessageProperty remoteEndpoint = request.Properties 
    [RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty; 

     //remoteEndpoint.Address will give you the address. 

     return null; 
    } 
+0

は 'host.Open()'を呼び出す前に、WCFサービスにこれを添付する簡単な方法はありますか?私が見た唯一のことは、私がメッセージインスペクターその後、結合、および、特別な動作を作成しなければならなかったということでした。私は、このアウトを理解しようとしている私の髪をリッピングし、最終的にあきらめました。それから私は 'ServiceAuthorizationManager'を発見しました。 – Volomike

1

ServiceAuthorizationManagerでこれを行うための巧妙な方法はあり、それはIDispatchMessageInspectorのすべて真剣にハードワークよりもはるかに簡単です。 、あなたのサービスでは、右のあなたのhost.Open()呼び出しの前に、MyServiceAuthorizationManagerへのリンクを追加し

public class MyServiceAuthorizationManager : ServiceAuthorizationManager 
{ 
    protected override bool CheckAccessCore(OperationContext operationContext) 
    { 
    string classMethod = operationContext.RequestContext.RequestMessage.Headers.Action; 
    if (classMethod.Contains("/transfer/Get")) 
    { 
     return true; // because someone is simply updating a client service reference 
    } 
    Console.WriteLine("Class Method Call: {0}",classMethod); 
    // do something with operationContext here as you need to inspect stuff 
    // return true if you want this class method call to succeed and go through 
    // return false if you want this class method to fail on the client 
    return true; 
    } 
} 

はそうのようなあなたのWCFサービスプロジェクトにクラスを作成します。

クライアント接続をテストすると、コンソールからどのクラスメソッドが呼び出されたかが出力されます。また、operationContextオブジェクト内のすべてのものに対して作業することもできます。

これを使用する方法の1つは、セキュリティヘッダーチェック用です。私のクライアントでは、ヘッダーを追加します。次に、サービスでは、このCheckAccessCore()コールで、このカスタムヘッダーが存在することを確認します。もしそうでなければ、私は偽を返します。これはハッカーを保護する1つ以上の保護レイヤーであり、Named Pipes構成の制限付きセキュリティにも最適です。また、サービスのすべてのクライアントのメソッド呼び出しで自動的に送信されるカスタムヘッダーを追加する方法の詳細については、click hereも参照してください。

このうち、私は行動、要求、リスナー、またはメッセージディスパッチを混乱させる必要はありませんでした。 WCF設定を編集する必要もありませんでした。

上記の/transfer/Getの文字列チェックに注意してください。私のようなセキュリティ機構としてヘッダーチェックを行っている場合、これは重要です。その条件を持たずにtrueを返すと、WCFクライアントのIDEはServiceReferenceを更新できません。これは、IDEがその余分なヘッダーを知らないためです(カスタムヘッダーを追加していて、 WCFクライアントのapp.config)。それ以外の場合は、エラーThe URI prefix is not recognizedが表示されます。

関連する問題