连接到WCF管道

5

有没有一种方法可以检查WCF方法调用。我的意思是与ASP.NET中的HttpModule相等的任何内容。

我想在任何方法调用之前执行一个方法。

3个回答

8

WCF拥有非常可扩展的架构。可以拦截和自定义许多WCF功能以执行自定义操作。

对于您的情况,您需要编写适当的服务或端点行为。从传输通道接收消息到调用您的服务方法之间的过程称为分派。 WCF使用一组Behaviors来执行分派。您可以提供自己的Behavior来检查方法调用。

本文提供了一个很好的概述和示例 - 使用自定义行为扩展WCF

我还建议您阅读这篇WCF架构概述http://msdn.microsoft.com/en-us/library/aa480210.aspx


2
第一个链接已经失效。 - Jon-Eric

0

IOperationInvoker 可能是您正在寻找的内容:

public class MyOperationInvoker : IOperationInvoker
{
    IOperationInvoker originalInvoker;
    public MyOperationInvoker(IOperationInvoker originalInvoker)
    {
        this.originalInvoker = originalInvoker;
    }

    public bool IsSynchronous { get { return originalInvoker.IsSynchronous; } }

    public object[] AllocateInputs() { return originalInvoker.AllocateInputs(); }

    public object Invoke(object instance, object[] inputs, out object[] outputs)
    {
        //Do stuff before call
        var res = this.originalInvoker.Invoke(instance, inputs, out outputs);
        //stuff after call
        return res;
    }

    public IAsyncResult InvokeBegin(object instance, object[] inputs,
                AsyncCallback callback, object state)
    {
        //Do stuff before async call
        var res = this.originalInvoker.InvokeBegin(instance, inputs, callback, state);
        return res;
    }

    public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
    {
        var res = this.InvokeEnd(instance, out outputs, result);
        //Do stuff after async call
        return res;
    }
}

在服务中,所有操作都实现为属性:

public class MyBehaviorAttribute : Attribute, IServiceBehavior, IOperationBehavior
{
    //IOperationBehavior
    public void ApplyDispatchBehavior(OperationDescription operationDescription,
            DispatchOperation dispatchOperation)
    {
        dispatchOperation.Invoker = new MyOperationInvoker(dispatchOperation.Invoker);
    }

    public void AddBindingParameters(OperationDescription operationDescription,
            BindingParameterCollection bindingParameters) { /*Do nothing*/ }

    public void ApplyClientBehavior(OperationDescription operationDescription,
            ClientOperation clientOperation) { /*Do nothing*/ }

    public void Validate(OperationDescription operationDescription) { /*Do nothing*/ }

    //IServiceBehavior
    public void Validate(ServiceDescription serviceDescription,
                ServiceHostBase serviceHostBase) { /*Do nothing*/ }

    public void AddBindingParameters(ServiceDescription serviceDescription,
                ServiceHostBase serviceHostBase,
                Collection<ServiceEndpoint> endpoints,
                BindingParameterCollection bindingParameters) { /*Do nothing*/ }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
                ServiceHostBase serviceHostBase)
    {
        foreach (ServiceEndpoint endpoint in serviceHostBase.Description.Endpoints)
        {
            foreach (var operation in endpoint.Contract.Operations)
            {
                operation.Behaviors.Add(this);
            }
        }
    }

还有这项服务:

[MyBehavior]
public class HelloService : IHelloService
{
    ...
}

0

这取决于您想在消息中检查或修改什么以及在哪个级别上进行。如果您想在编码级别上修改某些内容,可以选择自定义消息编码器;如果是在请求反序列化之前或在发送回复给客户端之前进行修改,则使用自定义消息检查器。

希望对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接