I am a big fan of DRY coding and I like to avoid boiler plate code as much as possible. So I reworked my entire WCF channel into an AOP class that focuses on the WCF channel life cycle.
I am also a big fan of async waiting, especially with WCF, as it theoretically frees up a thread that will usually wait for a response.
So I created an interceptor in the fluentAOP lib
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; } }
However, after thinking a little about the solution, I noticed that in the case of a WCF contract, the forms
[ServiceContract] public interface IFoo { [OperationContract] Task<int> GetInt(); }
GetInt will have unexpected results. First, catch FaultException will do nothing. Secondly, I would close the channel before the request returns. Theoretically, I could switch to a different code path if the return type has Task. But I cannot figure out how to wait for the results of Task <>, and then return the expected one.
This, of course, is especially difficult, since during the execution of AOP I would not have access to using generics of the return type (without a whole reflection).
Any ideas on how to implement this function as expected, which closes the channel on termination and catch / marshals exceptions for the calling thread?
source share