标签:
WCF采用基于契约的服务调用方法,通过System.ServiceModel.ChannelFactory<TChannel>直接创建服务代理对象。
创建服务代理
public static T Create<T>(string endpointName) { if (string.IsNullOrEmpty(endpointName)) { #region 默认配置,根据类名,赋值endpointName #endregion throw new ArgumentNullException("endpointName"); } return (T)(new ServiceRealProxy<T>(endpointName).GetTransparentProxy()); }
public class ServiceRealProxy<T> : RealProxy { private readonly string _endpointName; public ServiceRealProxy(string endpointName) : base(typeof(T)) { if (string.IsNullOrEmpty(endpointName)) { throw new ArgumentNullException("endpointName"); } _endpointName = endpointName; } public override IMessage Invoke(IMessage msg) { T channel = ChannelFactoryCreator.Create<T>(this._endpointName).CreateChannel(); var methodCall = (IMethodCallMessage)msg; IMethodReturnMessage methodReturn = null; object[] copiedArgs = Array.CreateInstance(typeof(object), methodCall.Args.Length) as object[]; methodCall.Args.CopyTo(copiedArgs, 0); try { object returnValue = methodCall.MethodBase.Invoke(channel, copiedArgs); methodReturn = new ReturnMessage(returnValue, copiedArgs, copiedArgs.Length, methodCall.LogicalCallContext, methodCall); var communicationObject = channel as ICommunicationObject; if (communicationObject != null) communicationObject.Close(); } catch (Exception ex) { if (ex.InnerException is CommunicationException || ex.InnerException is TimeoutException) { var communicationObject = channel as ICommunicationObject; if (communicationObject != null) communicationObject.Abort(); } methodReturn = ex.InnerException != null ? new ReturnMessage(ex.InnerException, methodCall) : new ReturnMessage(ex, methodCall); } return methodReturn; } }
标签:
原文地址:http://www.cnblogs.com/kingCpp/p/4905247.html