动态开启WCF服务

     /// <summary>
        /// 启动服务
        /// </summary>
        /// <param name="row">服务行</param>
        public void RunService(DSService.ServiceDLLRow row)
        {
            try
            {
                //获取类型
                Assembly ass = Assembly.LoadFrom(row.DLLPath);
                Type serviceType = ass.GetType(row.DLLRealize);
                if (serviceType == null)
                    throw new Exception(string.Format("无法反射:{0}的Tyte!", row.DLLRealize));

                
                bool isCallBackInterface =false;
                Type[] interfaceArr = serviceType.GetInterfaces();
                foreach (Type t in interfaceArr)
                {
                    object[] arr = t.GetCustomAttributes(true);
                    if(arr ==null || arr.Length==0)
                        continue;
                    foreach (object attr in arr)
                    {
                        if (attr is System.ServiceModel.ServiceContractAttribute)
                        {
                            if (((System.ServiceModel.ServiceContractAttribute)(attr)).CallbackContract != null)
                            {
                                isCallBackInterface = true;
                                break;
                            }
                        }
                    }
                }

                //创建服务主机
                Uri baseAddress = new Uri(row.AddressFull);
                ServiceHost sh = new ServiceHost(serviceType, baseAddress);
                //创建服务绑定
                Binding binding = ServiceDLLBiz.GetServiceBinding(row.NetTransport, isCallBackInterface);
                if (binding == null)
                    throw new Exception("无法支持的绑定!");


                //创建Endpoint
                //ServiceEndpoint endpoint = sh.AddServiceEndpoint(row.DLLContact, binding, row.DLLRealize);//interface
                ServiceEndpoint endpoint = sh.AddServiceEndpoint(row.DLLContact, binding, string.Empty);//interface


                if (binding is System.ServiceModel.WebHttpBinding)
                {
                    WebHttpBehavior httpBehavior = new WebHttpBehavior();
                    
                    endpoint.Behaviors.Add(httpBehavior);
                }

                foreach (var operation in endpoint.Contract.Operations)
                {
                    var dataContractBehavior = operation.Behaviors.Find<DataContractSerializerOperationBehavior>();
                    if (dataContractBehavior != null)
                    {
                        dataContractBehavior.MaxItemsInObjectGraph = int.MaxValue;
                    }
                }

                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                string mex = row.AddressFull.Replace(dicNetTransport[row.NetTransport], "http://") + "/" + row.NetTransport;
                if (binding is NetTcpBinding)
                {
                    mex = mex.Replace(row.Port, (Int32.Parse(row.Port) + 1).ToString());
                    if (isCallBackInterface && binding is NetTcpBinding)
                        (binding as NetTcpBinding).TransferMode = TransferMode.Buffered;
                }
                smb.HttpGetUrl = new Uri(mex);
                sh.Description.Behaviors.Add(smb);

                
                sh.Open();

                //添加进服务Dic
                row.IsOpen = true;
                row.AddressMex = mex;
                row.AddressFull = endpoint.Address.Uri.ToString();
                _dicHost.Add(row, sh);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

  2.DSService.ServiceDLLRow结构

原文地址:https://www.cnblogs.com/seacher/p/8565796.html