将事件和委托用于 .NET Framework 远程处理
本主题介绍一项传统技术,保留该技术是为了向后兼容现有的应用程序,不建议对新的开发使用该技术。现在应该使用 Windows Communication Foundation (WCF) 来开发分布式应用程序。
虽然可以在 .NET Framework 远程处理中使用事件和委托,但必须解决两个主要问题才能成功使用它们。具体而言,只有通过 IpcChannel 使用身份验证时,才应使用事件和委托。
使用委托
远程处理委托会带来安全问题,必须加以解决。如果客户端向服务器传递了委托(通常在客户端向远程事件附加事件处理程序时执行此操作),附加的委托可能会引用具有相同签名的未授权方法作为服务预期的方法。由于非预期的方法签名与预期的方法签名匹配,因此服务可以调用非预期的方法,即使该方法为静态方法(因而无法在远程客户端上调用)也不例外。
若要缓解此问题,服务器应使用自定义参数类型定义委托,而包含这些类型的程序集应具有强名称。另外,还应始终对这类通信进行身份验证(如果不加密的话)。对于服务器上的类型,如果您不确定它是否为预期的类型,则切勿允许对该类型进行反序列化。
使用事件
鉴于委托所带来的安全问题,不建议使用事件。而应定义客户端回调服务,以发布该服务在必须与客户端通信时可以调用的方法。如果您决定对经过身份验证的 IpcChannel 使用远程处理过的事件(并且已按前面的说明声明了委托),则应将客户端事件处理程序的方法设置为单向调用。其原因在于,当引发事件时,服务器会调用事件调用列表中的委托。事件系统将阻止该调用,直至客户端返回或超时。因此,只有在事件处理程序为单向方法时,未侦听的客户端才会显著减少简单事件的吞吐量。