在进行Remoting开发过程中,一种流行的做法是将诸如对象激活方式,注册通道的类型,端口信息等写在配置文件中,然后使用RemotingConfiguration.Configure (String)方法读取这些信息并完成远程调用的配置。此时你会发现,.NET编译器提示该方法已经过期,推荐使用RemotingConfiguration.Configure (String, Boolean),这是.NET FrameWork2.0版中新增的方法。后者与前者的区别仅在于多了一个参数,完整的表示形式为:
public static void Configure ( string filename, bool ensureSecurity )
那么后面的这个ensureSecurity布尔型参数究竟有什么用呢。Msdn上给出的解释非常简单,如下:
ensureSecurity
如果启用安全性,则为 true;否则为 false。
显然不满足安全性要求会抛出一个SecurityException异常来,但是如何启用安全性,处理针对谁的安全性都没有详细的说明。在Google上搜索了一下,发现大家还热衷于使用那个过时的版本,很少有用public static void Configure ( string filename, bool ensureSecurity )这种形式的,至于相关说明就更是少之又少。难道微软提出了这样一个新的方法只是在作秀吗?
不,其实这个方法中隐藏着许多秘密,要想知道更多的信息不妨让我们用反编译工具揭开它神秘的面纱,看看内部究竟做了些什么?下面是用.Net Reflecter工具看到的Configure ( string filename, bool ensureSecurity )内部实现代码:
[SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)]
public static void Configure(string filename, bool ensureSecurity)
{
RemotingConfigHandler.DoConfiguration(filename, ensureSecurity);
RemotingServices.InternalSetRemoteActivationConfigured();
}
看来,Configure方法只是最外面的一层包装纸,真正进行远程配置的其实是里面的两个方法。跟踪到DoConfiguration()方法中去,如下:
internal static void DoConfiguration(string filename, bool ensureSecurity)
{
RemotingConfigHandler.LoadMachineConfigIfNecessary();
RemotingXmlConfigFileData data1 = RemotingConfigHandler.LoadConfigurationFromXmlFile(filename);
if (data1 != null)
{
RemotingConfigHandler.ConfigureRemoting(data1, ensureSecurity);
}
}
继续探查RemotingConfigHandler的ConfigureRemoting方法作了什么,感觉离真相已经不远了。
private static void ConfigureRemoting(RemotingXmlConfigFileData configData, bool ensureSecurity)
{
try
{
string text1 = configData.ApplicationName;
if (text1 != null)
{
RemotingConfigHandler.ApplicationName = text1;
}
if (configData.CustomErrors != null)
{
RemotingConfigHandler._errorMode = configData.CustomErrors.Mode;
}
RemotingConfigHandler.ConfigureChannels(configData, ensureSecurity);
if (configData.Lifetime != null)