有没有一种方法可以检查WCF方法调用。我的意思是与ASP.NET中的HttpModule相等的任何内容。
我想在任何方法调用之前执行一个方法。
WCF拥有非常可扩展的架构。可以拦截和自定义许多WCF功能以执行自定义操作。
对于您的情况,您需要编写适当的服务或端点行为。从传输通道接收消息到调用您的服务方法之间的过程称为分派。 WCF使用一组Behaviors来执行分派。您可以提供自己的Behavior来检查方法调用。
本文提供了一个很好的概述和示例 - 使用自定义行为扩展WCF。
我还建议您阅读这篇WCF架构概述http://msdn.microsoft.com/en-us/library/aa480210.aspx
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
{
...
}
这取决于您想在消息中检查或修改什么以及在哪个级别上进行。如果您想在编码级别上修改某些内容,可以选择自定义消息编码器;如果是在请求反序列化之前或在发送回复给客户端之前进行修改,则使用自定义消息检查器。
希望对您有所帮助。