最近利用WCF+Winform做了一个项目,到目前为止感觉WCF还是挺不错的,但感觉要升级或者维护WCF的时候就比较麻烦了,
因为就项目的需求来说需要经常性的添加功能和修改一些程序上的BUG,所以Server端频繁的替换更新DLL文件是在所难免了,
但又不能停Server来更新文件DLL文件,刚开始的时候我尝试直接对Server端的DLL文件进行替换,但这样系统会提示DLL文件正在使用中,
无法进行替换,后来我看了网上的一个办法,程序启动时将用到的DLL文件读到内存,然后程序再从内存里面去加载DLL文件,
这样硬盘上的DLL文件就可以被替换了,刚开始我为之大喜,但新的问题又出现了,
虽说现在已经可以动态的替换DLL的文件了,但是我替换了DLL文件之后才发现Server仍然是用旧的DLL的算法,
Server端的宿主是Windows服务,WCF的绑定方式是NetTcpBing,以下是Server和Client的部分代码Servere端开启代码:
            Assembly asm = null;
            byte[] addinStream = null;            //把DLL读取到内存
            FileStream FStream = new FileStream(Application.StartupPath + @"\MacauIT_DAL.dll", FileMode.Open, FileAccess.Read);
            BinaryReader Breader = new BinaryReader(FStream);
            addinStream = Breader.ReadBytes((int)FStream.Length);
            FStream.Close();
            FStream.Dispose();
            Breader.Close();
            Breader.Dispose();            //加载内存中的Dll
            asm = Assembly.Load(addinStream);             Type type = asm.GetType("MacauIT.DAL.MacauIT_Services");            Uri baseMacauITAddress = new Uri("net.tcp://localhost:8731");
            MacauITServiceHost = new ServiceHost(type, baseMacauITAddress);
            MacauITServiceHost.Open();
Client端引用代码:
            public static MacauIT_Services MIT_Services = new MacauIT_Services();//客户端使用的是全局公共的静态实例连接
            string str =  CommonClass.MIT_Services.GetStr_GetHello()  //Server和Client使用的是代理方法请问Server的DLL替换了之后,客户端调用时怎样才调用到新的DLL里面的算法,而不是旧的DLL算法呢?可不可以在新的DLL替换之后重新更新Server而又不关闭连接呢?

解决方案 »

  1.   


    你们的WCF这么重要啊
    重新了,连停一会都不行?
    这么重要的WCF服务,不会只用一台服务器吧?
      

  2.   

    你们的WCF这么重要啊
    重新了,连停一会都不行?
    这么重要的WCF服务,不会只用一台服务器吧?目前就還真的只有一臺服務器
      

  3.   


    如果實在沒辦法,打算用NLB來做群集了,這樣服務器也有個保險,你們兩臺服務器是如何做到把用戶轉移到另外一臺服務器的呢?
      

  4.   

    Server2003或者2008NLB做集群吧,这么重要的Server
      

  5.   

    估计SocketUpEx的“入口服务”是指物理上的负载平衡,而不是通过代码是判断Server进行入口切换