是否有办法检查wcf方法调用。我的意思是与asp.net中的HttpModule相同。
我想在任何方法调用之前执行一个方法。
答案 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);
}
}
}