最近公司需要开发一个新项目,是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了,未关闭的又可以被客户端继续访问。。。。。。。。