挂钩进入wcf管道

时间:2010-12-17 05:30:03

标签: c# asp.net wcf

是否有办法检查wcf方法调用。我的意思是与asp.net中的HttpModule相同。

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

3 个答案:

答案 0 :(得分:7)

WCF具有非常可扩展的体系结构。可以拦截和定制许多WCF功能来做你自己的事情。

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

本文提供了一个很好的概述和示例 - http://msdn.microsoft.com/en-us/magazine/cc163302.aspx

我还建议您浏览此WCF架构概述http://msdn.microsoft.com/en-us/library/aa480210.aspx

答案 1 :(得分:0)

这取决于您要在消息中检查或修改的级别。如果您想在编码级别修改某些内容,您可以选择自定义消息编码器,如果它在请求反序列化之前或在向客户端发送回复之前,请使用自定义消息检查器。

HTH。

答案 2 :(得分:0)

IOperationInvoker可能就是您所寻找的:

import { AfterViewInit } from '@angular/core';

@Component()
export class MyComponent implements AfterViewInit {

  @ViewChild(HomePage) homePage: HomePage;

  ngAfterViewInit() {
    this.homePage.testChild();
  }
}

作为服务中所有操作的属性实现:

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);
            }
        }
    }