1

私のサービスのどのメソッドが呼び出されているかをコンストラクター内で認識する可能性はありますか?

私の例:を介して一時停止できるサービスを構築して、一時停止SetPauseService(true)中に彼が作業を行わないようにします。すべてのメソッドで一時停止フラグをチェックしたくないので、これをコンストラクターでアーカイブしようとしています。私の問題は、SetPauseService(false)サービスを一時停止している間にユーザーが電話をかけて、サービスを再度アクティブにする必要があることです。

[ServiceContract]
public class MyService
{

    private static bool isPaused;

    public MyService()
    {
        if (/*<Pseudo>*/ InvokedMethod != "SetPauseService" /*</Pseudo>*/)
        {
            if (isPaused)
            {
                throw new Exception("Cannot be executed, service is paused!");
            }
        }
    }

    [OperationContract]
    public void SetPauseService(bool status)
    {
        isPaused = status;
    }

    [OperationContract]
    public void DoWork()
    {
        /* ... */
    }
}
4

3 に答える 3

5

あなたが探しているものは次の場所にあると思います:

OperationContext.Current.IncomingMessageHeaders.Action

これにより、呼び出された操作が公開されます。これはあなたが必要としていたものですか?

于 2013-01-23T08:28:15.290 に答える
2

この場合、3 つのオプションがあると思います。

  1. サービスが一時停止されているかどうかを確認する WCF インスタンスの動作を記述します。WCF サービスのインスタンス コンテキスト モードは呼び出しごとではない (たとえば、呼び出しごとに新しいサービス インスタンスを作成していない) と仮定します。次に、サービス クラスのインスタンスを返すインスタンス ビヘイビアーを実装できます。また、実装するとリクエストにアクセスできるようになります。呼び出されたメソッドを確認して、応答を処理するか、単に要求を破棄することができます。おそらく、これを実装するために他の動作タイプを使用できます。より適切なものがあるかもしれません ( http://msdn.microsoft.com/en-us/magazine/cc163302.aspxで確認できます)。

  2. メソッドで属性を使用して、サービスが一時停止しているかどうかを確認します。PostSharp を使用して、メソッドが呼び出される直前にコードを挿入できます。メソッド呼び出し前に一時停止状態を確認し、実行するかどうかを決定できます。ポストシャープを参照

  3. サービスが一時停止されているかどうかを確認するために、何らかのアクションでメソッド コードをカプセル化します。Actionパラメータとして s を受け入れる一般的な関数を書くことができます。元。

    public void CheckPauseStatusAndExecuteIfTrue(Action action)
    {
        if (!this.isPaused)
        {
            action();
        }
    }
    

    ...

    [OperationContract]
    public void DoWork()
    {
        this.CheckPauseStatusAndExecuteIfTrue(() =>
        {
            //// write your method behavior
        });
    }
    
于 2013-01-23T08:15:10.897 に答える
0

そこにある場合は、おそらく OperationContext.Current にあります。私はそれに頼りません: 構築は WCF によって制御されます。試す場合は、必ず「PerCall」モードを使用してください。

より良い方法は、カスタム パラメータ インスペクタを実装することです。(IParameterInspector を実装し、動作にバインドします) メソッド オブジェクト BeforeCall(string operationName, object[]inputs) を使用して作業を行うことができます。

いずれにせよ、クライアントからの接続が山積みになるため、サービスを「一時停止」することに反対票を投じます。単純にサービスホストを停止し、クライアントで「一時停止」を処理し、作業が完了したら再度開始する方がよい場合があります。

于 2013-01-23T08:22:53.123 に答える