惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
V
V2EX
GbyAI
GbyAI
Recent Announcements
Recent Announcements
Microsoft Security Blog
Microsoft Security Blog
阮一峰的网络日志
阮一峰的网络日志
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
Y
Y Combinator Blog
C
Check Point Blog
爱范儿
爱范儿
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
美团技术团队
雷峰网
雷峰网
IT之家
IT之家
WordPress大学
WordPress大学
V
Visual Studio Blog
Microsoft Azure Blog
Microsoft Azure Blog
MyScale Blog
MyScale Blog
N
News and Events Feed by Topic
罗磊的独立博客
S
SegmentFault 最新的问题
S
Security Affairs
aimingoo的专栏
aimingoo的专栏
F
Fortinet All Blogs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
H
Hacker News: Front Page
Google DeepMind News
Google DeepMind News
B
Blog
O
OpenAI News
C
Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
The Last Watchdog
The Last Watchdog
Hacker News: Ask HN
Hacker News: Ask HN
博客园_首页
人人都是产品经理
人人都是产品经理
C
Cybersecurity and Infrastructure Security Agency CISA
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Help Net Security
Help Net Security
月光博客
月光博客
J
Java Code Geeks
L
LangChain Blog
博客园 - 司徒正美
Stack Overflow Blog
Stack Overflow Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Apple Machine Learning Research
Apple Machine Learning Research
T
The Exploit Database - CXSecurity.com
N
News and Events Feed by Topic
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 阿修罗一平

IIS部署WCF出现的各种问题汇总 Infragistics控件的工具栏注册 NUnit的使用中可能遇到的问题 Linq备忘 Nihibernate的重要知识点 Devexpress使用记录 使用List数据集合,利用DevExpress.XtraReports开发Master-Detail报表 PDA访问WCF PDA(WinCE)项目开发中遇到的问题及解决方法总结 Grid控件绑定bindingSource后在新增行时设置Cell的初始值 “BindingSource绑定单个实体对象后在代码中赋值无效和无法显示”的解决方法 sqlservier2005转成sqlserver2000中出现的问题(WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]) 项目考虑因素及解决方案(.net) 设计模式在工作中的应用(三) 设计模式在工作中的应用(二) 设计模式在工作中的应用(一) NHibernate示例 Remoting服务集成到IIS的简单总结 将公司系统从SqlServer 2K移植到Oracle 10g中的简要总结
关于Remoting服务启动和停止的简单总结
阿修罗一平 · 2007-08-17 · via 博客园 - 阿修罗一平
        

      很长一段时间,哪里工作紧急,哪里需要帮助,我就得往哪冲。工作了N年时间,经历和很多事情,想明白了一些事情,心态也好了很多。我想不论在什么公司,不论做什么工作,我们都可以从中获取些东西,都有机会实现我们的价值,关键是心态。前几天刚解决了几个问题,这不又来了一个问题。


   公司有一个系统,使用
Remoting实现分布式通信。服务端用于管理远程服务,完成注册和注销等工作。因为对于服务端的控制要求并不是很高,所以以前在实现注册和注销功能时都需要重新启动服务端,从而重新加载最新的服务。如果是配置一次两次还不觉得什么,可是如果改动很多,特别是开发期间注册新的服务,则很不方便,需要重启N次服务端。于是,工作就来了:要求改造控制单个服务而不影响其他服务或者重新启动系统。
   
    

因为是针对每个服务的控制,不希望在控制一个服务的时候,影响其他的服务,所以在这里使用了RemotingServices.Disconnect,而没有使用注销信道的方法ChannelServices.UnregisterChannel

为了实现这个功能,定义了一个ServiceContainer类,有一个服务集合变量IDictionary<string,MarshalByRefObject> serviceObjectTable,用于缓存在服务端启动的服务对象。我还定义两个方法StartServiceStopService方法,实现分别如下:

     

/// <summary>
        
/// 开启服务
        
/// </summary>
        
/// <param name="serviceType"></param>

        public void StartService(System.Type serviceType)
        
{
            TypeReflect reflect 
= new TypeReflect();
            ServiceAttribute sa 
= reflect.GetServiceAttribute<ServiceAttribute>(serviceType);

            
if (sc != null)
            
{
                MarshalByRefObject serviceObj 
= System.Activator.CreateInstance(serviceType) as MarshalByRefObject;

                
if (serviceObj != null)
                
{
                    
string key = serviceType.FullName + "_" + sa.Version;
                    
if (serviceObjectTable.Keys.Contains(key) == false)
                    
{
                         serviceObjectTable.Add(key, serviceObj);

                         RemotingServices.Marshal(serviceObj, key);
                    }

                }

            }

        }


        
/// <summary>
        
/// 停止服务
        
/// </summary>
        
/// <param name="serviceType"></param>

        public void StopService(System.Type serviceType) 
        
{
            TypeReflect reflect 
= new TypeReflect();
            ServiceAttribute sa 
= reflect.GetServiceAttribute<ServiceAttribute>(serviceType);

            
string key = serviceType.FullName + "_" + sa.Version;

            
if (serviceObjectTable.Keys.Contains(key))
            
{                
                RemotingServices.Disconnect(serviceObjectTable[key]);
                serviceObjectTable.Remove(key);                 
            }

        }

    其实最主要的步骤就是 :
   启动:MarshalByRefObject serviceObj = System.Activator.CreateInstance(serviceType) as MarshalByRefObject;
         RemotingServices.Marshal(serviceObj, key);

   停止:

        RemotingServices.Disconnect(_ServiceObjectTable[key]);

   
   好了,问题已经解决了。周末了,应该快乐一下。