.net Remoting 示例代码

来源:互联网 发布:java自带线程池 编辑:程序博客网 时间:2024/05/22 13:27

最近一个项目用到这个东西,就整理了下写了示例,仅供新手参考,如有不当之处请大侠指点一二;

首先要说明Remoting是个什么东西了,它是microsoft结合.net的基础上延伸出来的采用分布式编程的一种技术,Remoting主要用于管理跨应用程序域的同步和异步RPC 会话。在默认情况下,Remoting使用 HTTP 或 TCP 协议,并使用 XML 编码的 SOAP 或本机二进制消息格式进行通信。.NET Remoting 提供了非常灵活和可扩展的编程框架,并且他可以管理对象的状态。 Remoting还支持IPC信道,IPCChannel是.NET Framework 2.0 里面新增的,它使用 Windows 进程间通信 (IPC) 系统在同一计算机上的应用程序域之间传输消息。在同一计算机上的应用程序域之间进行通信时,IPC 信道比 TCP 或 HTTP 信道要快得多。但是IPC只在本机应用之间通信。所以,在客户端和服务端在同一台机器时,我们可以通过注册IPCChannel来提高Remoting的性能,否则只能是tcp信道或http信道;

下面请看示例:

一、创建远程对象

public interface IPowerService     {        string WriteLog();    } public class UserService : MarshalByRefObject,IPowerService    {        public DataTable GetUserList()        {            string sql = "select * from BAS_USER ";            return new UserData().GetUserList(sql);        }        public string WriteLog()        {            return "系统日志记录时间是:" + DateTime.Now.ToLocalTime() ;        }    }

二、创建一个宿主程序,这个程序可以是控制台应用程序,也可以是winforms程序,还可以是web应用程序让IIS承载;创建宿主程序的步骤 1定义并注册通道 2注册服务器激活的远程对象

 try            {                HttpServerChannel server = new HttpServerChannel(9000);                //TcpServerChannel server = new TcpServerChannel(9001);                ChannelServices.RegisterChannel(server, false);                RemotingConfiguration.RegisterWellKnownServiceType(typeof(UserService), "UserService.rem", WellKnownObjectMode.Singleton);                Console.WriteLine("服务启动成功!");                Console.WriteLine("----------------------------------------------------------------");                Console.ReadLine();            }            catch (Exception ex)            {                Console.WriteLine("服务启动失败:" + ex.Message);                Console.WriteLine("----------------------------------------------------------------");                Console.ReadLine();            }

三、客户端调用程序

IPowerService obj = null;                try                {                    //ChannelServices.RegisterChannel(new System.Runtime.Remoting.Channels.Http.HttpClientChannel(), false);                    ChannelServices.RegisterChannel(new System.Runtime.Remoting.Channels.Http.HttpClientChannel(), false);                }                catch (Exception ex)                {                    Response.Write(ex.Message.ToString());                }                //obj = (IPowerService)Activator.GetObject(typeof(IPowerService), "tcp://192.168.2.102:9001/UserService.rem");                obj = (IPowerService)Activator.GetObject(typeof(IPowerService), "http://192.168.2.102:9000/UserService.rem");                if (obj != null) {                    var us = (obj as UserService);                    var dt = us.GetUserList();                    StringBuilder sb = new StringBuilder();                    if (dt != null)                    {                                                foreach (DataRow item in dt.Rows)                        {                            sb.Append(item["Login_Name"] + "<br />");                        }                                            }                    sb.Append("-------------------tcp or http demo-----------------" + us.WriteLog());                    Literal1.Text = sb.ToString();                }                else                {                    Literal1.Text = "与服务器连接失败!";                }

注意:当服务器端定义的是如http信道,那么客户端调用的必须也是http信道;




0 0
原创粉丝点击