最近公司需要開發一個新項目,是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了,未關閉的又可以被客戶端繼續訪問。。。。。。。。