C#(AOP)方法拦截器

C#(AOP)方法拦截器,c#,function,methods,aop,interceptor,C#,Function,Methods,Aop,Interceptor,我有很多web服务方法,我想在一个函数中验证所有这些方法。 比如, [Intercept] public string Method1(POS pos, int param1, string param2) { return String.Format("{0}: {1}", param1,param2); } [Intercept] public int Method2(POS pos, int param3) { return param3 * 2; } public v

我有很多web服务方法,我想在一个函数中验证所有这些方法。 比如,

[Intercept]
public string Method1(POS pos, int param1, string param2)
{
    return String.Format("{0}: {1}", param1,param2);
}

[Intercept]
public int Method2(POS pos, int param3)
{
    return param3 * 2;
}

public void OnPreProcessing(...)
{
     // Before Mothod1 and Method2 called, It should enter here
     // I want to be able to cancel method execution and return another value.
     // I want to get the method name, parameter names and values         
}
现在我正在使用ContextBoundObject和IMessageSink来实现这一点。我可以获取方法名、参数和值,但不能取消方法执行并返回另一个值。我正在使用下面的东西

public IMessage SyncProcessMessage(IMessage msg)
{
    var mcm = msg as IMethodCallMessage;
    OnPreProcessing(ref mcm);
    var retMsg = _NextSink.SyncProcessMessage(msg) as IMethodReturnMessage;
    OnPostProcessing(mcm, ref retMsg);
    return retMsg;
}
如何取消方法执行并返回另一个值


谢谢。

只需设置一个取消检测即可忽略呼叫

[Intercept]
public string Method1(POS pos, int param1, string param2)
{
    return String.Format("{0}: {1}", param1,param2);
}

[Intercept]
public int Method2(POS pos, int param3)
{
    return param3 * 2;
}

public bool OnPreProcessing(...)
{
     // Before Mothod1 and Method2 called, It should enter here
     // I want to be able to cancel method execution and return another value.
     // I want to get the method name, parameter names and values         
}
例如,如果需要取消调用,OnPreProcessing返回一个布尔值,该布尔值为true

public IMessage SyncProcessMessage(IMessage msg)
{
    var mcm = msg as IMethodCallMessage;
    var cancel = OnPreProcessing(ref mcm);
    var retMsg = cancel ? /*IMethodReturnMessage for cancelation*/ : _NextSink.SyncProcessMessage(msg) as IMethodReturnMessage;
    OnPostProcessing(mcm, ref retMsg);
    return retMsg;
}

请提供更多关于您的“服务”的信息。WCF?休息服务?网络服务?另外,请重新标记您的问题。这是web服务。但是,我必须对任何方法执行此操作,而不仅仅是WebMethods。