When communicate with Another System , for some reason need to :
1. log the time (calling time , etc)
2.Exception handling
This is a RPC caller which handles exception in each call
/// <summary> /// Remote Procedure Call Proxy /// Add log(timeline,etc) before/after RPC /// Handle Remoting Call Exception /// </summary> /// <typeparam name="TIn"></typeparam> public class EdasRpcProxy<TIn> { public delegate void ActionRef<TIn>(ref TIn parameter); public static EdasResult SyncCallRef(ActionRef<TIn> func, ref TIn parameter) { return new EdasRpcProxy<TIn>().SynCRef(func, ref parameter); } public static EdasResult SyncCall(Action<TIn> action, TIn parameter) { return new EdasRpcProxy<TIn>().SynC(action, parameter); } private EdasResult SynCRef(ActionRef<TIn> func, ref TIn parameter) { try { func(ref parameter); return EdasResult.Create(ResultCode.Ok); } catch (Exception ex) { return EdasResult.Create(ResultCode.RemoteServerErr, string.Format(eDASConstants.Messages.RpcCallError, func.Method.Name)); } } private EdasResult SynC(Action<TIn> action, TIn parameter) { try { action(parameter); return EdasResult.Create(ResultCode.Ok); } catch (Exception ex) { return EdasResult.Create(ResultCode.RemoteServerErr, string.Format(eDASConstants.Messages.RpcCallError, action.Method.Name)); } } public void AsyncC<TOut>(Func<object, TOut> func, object parameter, Action<EdasResult<TOut>> callback) { Task<TOut>.Factory.StartNew(func, parameter).ContinueWith( (t => { var entity = t.Result; if (t.Exception != null) callback(EdasResult<TOut>.CreateResult(ResultCode.RemoteServerErr, default(TOut), string.Format (eDASConstants.Messages.RpcCallError, func.Method.Name))); else callback(EdasResult<TOut>.CreateResult(ResultCode.Ok, entity)); })); } } public class EdasRpcProxy<TIn, TOut> { public delegate TOut FuncRef<TIn, TOut>(ref TIn parameter); public static EdasResult<TOut> SyncCallRef(FuncRef<TIn, TOut> func, ref TIn parameter) { return new EdasRpcProxy<TIn, TOut>().SynCRef(func, ref parameter); } public static EdasResult<TOut> SyncCall(Func<TIn, TOut> func, TIn parameter) { return new EdasRpcProxy<TIn, TOut>().SynC(func, parameter); } private EdasResult<TOut> SynCRef(FuncRef<TIn, TOut> func, ref TIn parameter) { try { var ret = func(ref parameter); return EdasResult<TOut>.CreateResult(ResultCode.Ok, ret); } catch (Exception ex) { return EdasResult<TOut>.CreateResult(ResultCode.RemoteServerErr, default(TOut), string.Format(eDASConstants.Messages.RpcCallError, func.Method.Name)); } } private EdasResult<TOut> SynC(Func<TIn, TOut> func, TIn parameter) { try { var ret = func(parameter); return EdasResult<TOut>.CreateResult(ResultCode.Ok, ret); } catch (Exception ex) { return EdasResult<TOut>.CreateResult(ResultCode.RemoteServerErr, default(TOut), string.Format(eDASConstants.Messages.RpcCallError, func.Method.Name)); } } }