• WCF如何通过契约加编码方式调用


    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;
            }
        }
  • 相关阅读:
    JavaScript函数式编程——柯里化
    JavaScript使用纯函数避免bug
    ES6入门五:箭头函数、函数与ES6新语法
    图解--二分查找树
    电梯引发的思考
    VIM
    vs 2017
    多线程系列(四):Task
    多线程系列(三):线程池基础
    Docker for windows : 安装Redis
  • 原文地址:https://www.cnblogs.com/kingCpp/p/4905247.html
Copyright © 2020-2023  润新知