我是一个DRY编码的铁粉,尽可能避免样板代码。因此,我将所有的WCF通道烦恼重构成了一个AOP类,它处理WCF通道的生命周期。
我也非常喜欢使用async-await,特别是在WCF中,因为理论上它可以释放一个通常会因等待响应而处于休眠状态的线程。
因此,我在fluentAOP库中创建了一个拦截器。
然而,当我思考一下解决方案时,我注意到在一个类似以下WCF契约的情况下:
我也非常喜欢使用async-await,特别是在WCF中,因为理论上它可以释放一个通常会因等待响应而处于休眠状态的线程。
因此,我在fluentAOP库中创建了一个拦截器。
private static object InvokeOnChannel(IMethodInvocation methodInvocation)
{
var proxy = _factory.CreateChannel();
var channel = (IChannel) proxy;
try
{
channel.Open();
var ret = methodInvocation.Method.Invoke(proxy, methodInvocation.Arguments);
channel.Close();
return ret;
}
catch (FaultException ex)
{
if (ex.InnerException != null)
throw ex.InnerException;
throw;
}
catch(Exception)
{
channel.Abort();
throw;
}
}
然而,当我思考一下解决方案时,我注意到在一个类似以下WCF契约的情况下:
[ServiceContract]
public interface IFoo
{
[OperationContract]
Task<int> GetInt();
}
GetInt可能会产生意外结果。首先,捕获FaultException将不起作用。其次,在请求返回之前,我将关闭通道。如果返回类型为Task,则理论上可以切换到另一条代码路径。但我不知道如何等待Task<>的结果,然后返回一个awaitable。
当然,这特别困难,因为在运行时AOP中,我将无法使用返回类型的泛型(需要使用反射等诡异方法)。
您有什么想法来实现此函数作为可等待对象,它会在完成时关闭通道并将异常捕获/编组到调用线程?