1

如果我有一个 wcf 休息服务,例如http://somedomain.com/service.svc/uniqueid/somemethod/parameter1 那么有没有办法全局检查uniqueid是否对每个访问服务器的请求都有效。我可以检查每个操作合同,但我正在寻找一种不需要这样做的方法,以便每次访问服务时都会检查 uniqueid,如果无效则不会继续。

只是为了进一步了解我想要实现的目标...... WCF 服务是一个开放的 API。获取 uniqueid 也是开放的,不需要任何注册。我想使用 uniqueid,所以如果 API 被滥用,我可以轻松地获取 1 个 ID 的访问权限,而不会影响系统的任何其他用户。

更新:根据 Mike 的建议,我创建了一个 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 回答