.NET Remoting——first things first(1):抛砖引玉
2008-04-07 11:52
204 查看
Microsoft® .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这种框架提供了多种服务,包括激活和生存期支持,以及负责与远程应用程序进行消息传输的通讯通道。格式化程序用于在消息通过通道传输之前,对其进行编码和解码。应用程序可以在注重性能的场合使用二进制编码,在需要与其他远程处理框架进行交互的场合使用 XML 编码。在从一个应用程序域向另一个应用程序域传输消息时,所有的 XML 编码都使用 SOAP 协议。出于安全性方面的考虑,远程处理提供了大量挂钩,使得在消息流通过通道进行传输之前,安全接收器能够访问消息和序列化流。
通常,如果没有底层框架的支持,管理远程对象的生存期会非常麻烦。.NET Remoting 提供了许多可供选择的生存期模型,这些模型分为两个类别:
客户端激活对象
客户端激活对象受基于租用的生存期管理器的控制,这种管理器确保了租用期满时对象可被回收。
服务器激活对象
对于服务器激活对象,开发人员则可以选择“单一调用”模式或“单一元素”模式。
案例介绍:
客户端调用在服务器注册的远程对象Calculate,获得对象后,使用Calulate方法。
远程对象
using System;
using System.Collections.Generic;
using System.Text;
namespace Inovout.Remoting.RemotingObject
{
/**//// <summary>
/// 算术运算
/// </summary>
public class Calculator : MarshalByRefObject
{
/**//// <summary>
/// 加法
/// </summary>
/// <param name="addend">加数</param>
/// <param name="augend">被加数</param>
/// <returns>加法结果</returns>
public double Addition(double addend, double augend)
{
return addend + augend;
}
/**//// <summary>
/// 减法
/// </summary>
/// <param name="subtrahend">减数</param>
/// <param name="minuend">被减数</param>
/// <returns>减法结果</returns>
public double Subtration(double subtrahend, double minuend)
{
return subtrahend - minuend;
}
/**//// <summary>
/// 乘法
/// </summary>
/// <param name="multiplicator">乘数</param>
/// <param name="faciend"><被乘法/param>
/// <returns>乘法结果</returns>
public double Multiplication(double multiplicator, double faciend)
{
return multiplicator * faciend;
}
/**//// <summary>
/// 除法
/// </summary>
/// <param name="divisor">除数</param>
/// <param name="dividend">被除数</param>
/// <returns>除法结果</returns>
public double Division(double divisor, double dividend)
{
return divisor / dividend;
}
}
}
服务器端
//创建信道
processResultTextBox.Text += "开始创建信道。" + Environment.NewLine;
TcpChannel serverChannel = new TcpChannel(8891);
processResultTextBox.Text += "创建信道成功。" + Environment.NewLine;
//注册信道
processResultTextBox.Text += "开始注册信道。" + Environment.NewLine;
ChannelServices.RegisterChannel(serverChannel, true);
processResultTextBox.Text += "注册信道成功。" + Environment.NewLine;
//注册远程对象
processResultTextBox.Text += "开始创建远程对象。" + Environment.NewLine;
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Calculator),
"CalculatorService", WellKnownObjectMode.Singleton);
processResultTextBox.Text += "创建远程对象成功。" + Environment.NewLine;
客户端
//创建信道
processResultTextBox.Text += "开始创建信道。" + Environment.NewLine;
TcpChannel clientChannel = new TcpChannel();
processResultTextBox.Text += "创建信道成功。" + Environment.NewLine;
//注册信道
processResultTextBox.Text += "开始注册信道。" + Environment.NewLine;
ChannelServices.RegisterChannel(clientChannel, true);
processResultTextBox.Text += "注册信道成功。" + Environment.NewLine;
//获取远程对象
processResultTextBox.Text += "开始获取远程对象。" + Environment.NewLine;
Calculator calculator = (Calculator)Activator.GetObject(
typeof(Calculator), "tcp://localhost:8891/CalculatorService");
processResultTextBox.Text += "获取远程对象成功" + Environment.NewLine;
//使用对象
processResultTextBox.Text += "开始使用远程对象。" + Environment.NewLine;
double firstNumber = double.Parse(firstNumberTextBox.Text.Trim());
double secondNumber = double.Parse(secondNumberTextBox.Text.Trim());
double result = 0;
switch (functorComboBox.SelectedIndex)
{
case 0:
result = calculator.Addition(firstNumber,secondNumber);
break;
case 1:
result = calculator.Division(firstNumber,secondNumber);
break;
case 2:
result = calculator.Multiplication(firstNumber,secondNumber);
break;
case 3:
result = calculator.Addition(firstNumber,secondNumber);
break;
}
processResultTextBox.Text += "远程对象完成计算。" + Environment.NewLine;
resultTextBox.Text = result.ToString();
processResultTextBox.Text += "远程对象计算已经输出成功。" + Environment.NewLine;
//注销信道
processResultTextBox.Text += "开始注销信道。" + Environment.NewLine;
ChannelServices.UnregisterChannel(clientChannel);
processResultTextBox.Text += "注销信道成功。" + Environment.NewLine;
通常,如果没有底层框架的支持,管理远程对象的生存期会非常麻烦。.NET Remoting 提供了许多可供选择的生存期模型,这些模型分为两个类别:
客户端激活对象
客户端激活对象受基于租用的生存期管理器的控制,这种管理器确保了租用期满时对象可被回收。
服务器激活对象
对于服务器激活对象,开发人员则可以选择“单一调用”模式或“单一元素”模式。
案例介绍:
客户端调用在服务器注册的远程对象Calculate,获得对象后,使用Calulate方法。
远程对象
using System;
using System.Collections.Generic;
using System.Text;
namespace Inovout.Remoting.RemotingObject
{
/**//// <summary>
/// 算术运算
/// </summary>
public class Calculator : MarshalByRefObject
{
/**//// <summary>
/// 加法
/// </summary>
/// <param name="addend">加数</param>
/// <param name="augend">被加数</param>
/// <returns>加法结果</returns>
public double Addition(double addend, double augend)
{
return addend + augend;
}
/**//// <summary>
/// 减法
/// </summary>
/// <param name="subtrahend">减数</param>
/// <param name="minuend">被减数</param>
/// <returns>减法结果</returns>
public double Subtration(double subtrahend, double minuend)
{
return subtrahend - minuend;
}
/**//// <summary>
/// 乘法
/// </summary>
/// <param name="multiplicator">乘数</param>
/// <param name="faciend"><被乘法/param>
/// <returns>乘法结果</returns>
public double Multiplication(double multiplicator, double faciend)
{
return multiplicator * faciend;
}
/**//// <summary>
/// 除法
/// </summary>
/// <param name="divisor">除数</param>
/// <param name="dividend">被除数</param>
/// <returns>除法结果</returns>
public double Division(double divisor, double dividend)
{
return divisor / dividend;
}
}
}
服务器端
//创建信道
processResultTextBox.Text += "开始创建信道。" + Environment.NewLine;
TcpChannel serverChannel = new TcpChannel(8891);
processResultTextBox.Text += "创建信道成功。" + Environment.NewLine;
//注册信道
processResultTextBox.Text += "开始注册信道。" + Environment.NewLine;
ChannelServices.RegisterChannel(serverChannel, true);
processResultTextBox.Text += "注册信道成功。" + Environment.NewLine;
//注册远程对象
processResultTextBox.Text += "开始创建远程对象。" + Environment.NewLine;
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Calculator),
"CalculatorService", WellKnownObjectMode.Singleton);
processResultTextBox.Text += "创建远程对象成功。" + Environment.NewLine;
客户端
//创建信道
processResultTextBox.Text += "开始创建信道。" + Environment.NewLine;
TcpChannel clientChannel = new TcpChannel();
processResultTextBox.Text += "创建信道成功。" + Environment.NewLine;
//注册信道
processResultTextBox.Text += "开始注册信道。" + Environment.NewLine;
ChannelServices.RegisterChannel(clientChannel, true);
processResultTextBox.Text += "注册信道成功。" + Environment.NewLine;
//获取远程对象
processResultTextBox.Text += "开始获取远程对象。" + Environment.NewLine;
Calculator calculator = (Calculator)Activator.GetObject(
typeof(Calculator), "tcp://localhost:8891/CalculatorService");
processResultTextBox.Text += "获取远程对象成功" + Environment.NewLine;
//使用对象
processResultTextBox.Text += "开始使用远程对象。" + Environment.NewLine;
double firstNumber = double.Parse(firstNumberTextBox.Text.Trim());
double secondNumber = double.Parse(secondNumberTextBox.Text.Trim());
double result = 0;
switch (functorComboBox.SelectedIndex)
{
case 0:
result = calculator.Addition(firstNumber,secondNumber);
break;
case 1:
result = calculator.Division(firstNumber,secondNumber);
break;
case 2:
result = calculator.Multiplication(firstNumber,secondNumber);
break;
case 3:
result = calculator.Addition(firstNumber,secondNumber);
break;
}
processResultTextBox.Text += "远程对象完成计算。" + Environment.NewLine;
resultTextBox.Text = result.ToString();
processResultTextBox.Text += "远程对象计算已经输出成功。" + Environment.NewLine;
//注销信道
processResultTextBox.Text += "开始注销信道。" + Environment.NewLine;
ChannelServices.UnregisterChannel(clientChannel);
processResultTextBox.Text += "注销信道成功。" + Environment.NewLine;
相关文章推荐
- .NET Remoting——first things first(2):Channel信道
- .NET Remoting——first things first(3):RemoteObject远程对象
- .NET Remoting——first things first(4):Summary概述
- 来自Ingo Rammer先生的Email-关于《Advanced .Net Remoting》
- [Remoting]dotNet Framework升级后Remoting信道使用的安全问题
- Microsoft .NET Remoting:技术概述
- ASP.NET MVC+Entity Framework code first 迁移
- My First Plug-in - Inventor API .NET 开发从0开始-课程1
- 创建以Microsoft .NET Remoting为基础的分布式应用架构
- 客户端调用第三方remoting 服务程序的n中方式,VB.NET 晚期邦定还真方便
- How to debug Web Services or .Net Remoting Components hosted in IIS in Windows 2003 Server
- [ZZ]Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
- Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
- .net Remoting(1)——起点,从示例做起
- Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
- Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
- Flex 与 Asp.Net 通过 Remoting 方式进行通讯 (三)
- asp.net mvc code first实体关系一对一、一对多、多对多的设置方法
- 【转】Microsoft .Net Remoting 之.Net Remoting基础篇
- Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇 (转)