当前位置: 首页 > news >正文

动态开启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

相关文章:

  • 地震灾害话题讨论与舆情舆论信息怎么收集的系统技术方法
  • Monkey原理
  • 舆情指数在哪里可以查到?具体平台与工具参考
  • 单例模式
  • 清博大数据网络舆情监测\控软件功能作用与类似软件有哪些详解
  • 【VNC】Linux环境VNC服务安装、配置与使用
  • 医院片面报舆情信息怎么监测的方法建议
  • JMeter,postman
  • 如何监测舆情?三款网上舆情搜索软件工具参考
  • 如何运用舆情分析研判软件进行舆情信息获取和分析的方法
  • while循环 不使用break 语法 ,声明变量,不等于
  • 网上热议话题产生的舆情信息怎么排查的系统软件方法
  • luogup3834(主席树模板)
  • 如何写一份社区舆情信息报告的范文格式模板详解
  • expect - 自动交互脚本(转)
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Apache Zeppelin在Apache Trafodion上的可视化
  • canvas 高仿 Apple Watch 表盘
  • ES6之路之模块详解
  • gulp 教程
  • Java 网络编程(2):UDP 的使用
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript设计模式系列一:工厂模式
  • Java深入 - 深入理解Java集合
  • Laravel核心解读--Facades
  • linux安装openssl、swoole等扩展的具体步骤
  • QQ浏览器x5内核的兼容性问题
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 半理解系列--Promise的进化史
  • 深入 Nginx 之配置篇
  • 实现菜单下拉伸展折叠效果demo
  • 小而合理的前端理论:rscss和rsjs
  • 译米田引理
  • 原生js练习题---第五课
  • mysql面试题分组并合并列
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (一)kafka实战——kafka源码编译启动
  • (转)EOS中账户、钱包和密钥的关系
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • []指针
  • [1204 寻找子串位置] 解题报告
  • [Angular 基础] - 表单:响应式表单
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C++]——带你学习类和对象
  • [CLickhouse] 学习小计
  • [FZSZOJ 1223] 上海红茶馆
  • [hdu2196]Computer树的直径