Fork me on GitHub
动态添加删除WCF服务类包

动态添加删除WCF服务类包

 

最近公司需要开发一个新项目,是WCF+WPF,服务器有2台,一台数据库服务器MSSQL,一台是用来跑WCF服务程序,客户端程序使用WPF开发winform程序

因为本项目将来会经常性的修改WCF程序,比如BUG或新增增删改功能(大家一样),但是又不能关闭当前正在使用的WCF服务。。。

我的解决方案是 使用一个宿主程序来控制一个WCF路由和动态加载/卸载N个WCF服务。

先来看看宿主界面,如下图:

宿主程序只包含一个WCF程序,该程序是用来公布后续被加载的WCF的URI地址,当然这个宿主程序的URI一般不会被变更,该服务必须一直开着,上图路由模块就是主入WCF服务的URI。

下图是加载WCF的DLL的效果图

 -----------------------难看的分割线---------------------

 下面贴主要部分的代码:

                Assembly MyAssembly = Assembly.LoadFrom("刚才加载的DLL地址");
                Type[] type = MyAssembly.GetTypes();
                List<Type> liSe = new List<Type>();


                //寻找服务接口
                foreach (Type t in type)
                {
                    if (t.IsClass)
                    {
                        foreach (Type item in t.GetInterfaces())
                        {
                            foreach (Object obj in item.GetCustomAttributes(true))
                            {
                                if (obj.ToString().Trim().ToUpper() == "System.ServiceModel.ServiceContractAttribute".ToUpper())
                                {
                                    liSe.Add(t);
                                    liSe.Add(item);
                                }
                            }
                        }
                    }
                }

                Uri baseAddress = new Uri("Uri地址,可以从文本框地址,注意格式验证");
                ServiceHost sh2 = new ServiceHost(liSe[0], baseAddress);//class
                sh2.AddServiceEndpoint(liSe[1], new WSHttpBinding(), liSe[0].Name);//interface
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                sh2.Description.Behaviors.Add(smb);
                sh2.Open();

------------------------难看的分割线---------------------------

上面的查找服务类不是很好,肯定有更好的方法,刚接触WCF。各位大神有方法一定要告诉我哦

通过上面的  我就可以动态加载WCF的DLL了,未关闭的又可以被客户端继续访问。。。。。。。。

 
 
posted on 2012-06-18 22:53  HackerVirus  阅读(262)  评论(1编辑  收藏  举报