zoukankan      html  css  js  c++  java
  • 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;
            }
        }
  • 相关阅读:
    Python判断文件和文件夹是否存在的方法
    机器学习之深度学习
    机器学习之深度学习
    以云计算与大数据为代表的信息技术是电力行业未来发展核心
    以云计算与大数据为代表的信息技术是电力行业未来发展核心
    机器学习之决策树(ID3)算法与Python实现
    机器学习之决策树(ID3)算法与Python实现
    R语言基础画图/绘图/作图
    R语言基础画图/绘图/作图
    rabbitmq 入门基础(一)
  • 原文地址:https://www.cnblogs.com/kingCpp/p/4905247.html
Copyright © 2011-2022 走看看