1

http://somedomain.com/service.svc/uniqueid/somemethod/parameter1などの wcf rest サービス がある場合、サーバーにヒットするすべてのリクエストに対して uniqueid が有効かどうかをグローバルにチェックする方法があります。すべての操作コントラクトをチェックすることはできますが、サービスにアクセスするたびにuniqueidがチェックされ、無効な場合は続行されないようにする方法を探しています。

私が達成しようとしていることについて、さらに背景を説明します... WCF サービスはオープン API です。uniqueid の取得もオープンであり、サインアップは必要ありません。uniqueid を使用したいので、API が乱用された場合、システムの他のユーザーに影響を与えることなく、1 つの ID のアクセスを簡単に取得できます。

更新:マイクの提案に基づいて、IParameterInspector を作成しました

[AttributeUsage(AttributeTargets.Class)]
class IDParameterInspector : Attribute, IParameterInspector

そして、それを私のサービスクラスに添付しました

[IDParameterInspector]
public class MetaData : IMetaData

私が今抱えている問題は、ApplyDispatchBehavior が実行されないことです。

public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        foreach (ChannelDispatcher channelDispatcher in serviceHostBase.ChannelDispatchers)
        {
            if (channelDispatcher == null)
            {
                continue;
            }

            foreach (var endPoint in channelDispatcher.Endpoints)
            {
                if (endPoint == null)
                {
                    continue;
                }

                foreach (var operation in endPoint.DispatchRuntime.Operations)
                {
                    operation.ParameterInspectors.Add(this);
                }
            }
        }
    } 

誰かが今私が間違っていることをしていますか?

4

2 に答える 2

1

これは、属性を介してパラメータ インスペクターとカスタム動作を使用する方法です。残念ながら、両方を実装する必要があります。

したがって、インターフェイスのサービスメソッドの装飾から始めます

[MyFirstCustomBehavior()]
string SayHello(string language);

次に、MyFirstCustomBehavior クラスを定義する必要があります。

internal sealed class MyFirstCustomBehavior : Attribute, System.ServiceModel.Description.IOperationBehavior
{

    #region IOperationBehavior Members

    public void AddBindingParameters(System.ServiceModel.Description.OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
    {
        //no special behaviour
    }

    public void ApplyClientBehavior(System.ServiceModel.Description.OperationDescription operationDescription, System.ServiceModel.Dispatcher.ClientOperation clientOperation)
    {
        throw new NotImplementedException();
    }

    public void ApplyDispatchBehavior(System.ServiceModel.Description.OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
    {
        dispatchOperation.ParameterInspectors.Add(new MyFirstCustomParameterInspector());
    }

    public void Validate(System.ServiceModel.Description.OperationDescription operationDescription)
    {
        //no special behaviour
    }

    #endregion
}

次に、インスペクターをコーディングする必要があります。

internal sealed class MyFirstCustomParameterInspector : System.ServiceModel.Dispatcher.IParameterInspector
{
    #region IParameterInspector Members

    public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
    {
        ////do stuff here
    }

    public object BeforeCall(string operationName, object[] inputs)
    {
        ////or here
        return null;
    }

    #endregion
}

これで準備完了です。

于 2012-06-08T15:59:50.233 に答える
0

すべての着信要求に影響を与えるカスタム サービス動作を作成してみることができます。

IP アドレスに基づいてリクエストをフィルタリングする例を次に示します。これを参照として使用できます時間があれば、いくつかのコードを投稿します。

于 2012-06-08T14:15:23.903 に答える