1

我正在尝试SslStream在新的AppDomain. 但是,BeginAuthenticateAsClient在流上运行该方法会导致抛出异常。

internal class SslWrapper : MarshalByRefObject
{
    public void CreateStream(Stream innerStream)
    {
        var ioStream = new SslStream(innerStream, 
                                     false,
                                     ValidateRemoteCertificate,
                                     SelectLocalCertificate);

        ioStream.BeginAuthenticateAsClient("Target",
                                           GetCertificates(),
                                           SslProtocols.Tls,
                                           false,
                                           new AsyncCallback(CallbackMethod), 
                                           null);
    }

    private void CallbackMethod(IAsyncResult result)
    {
        // TODO: handle callback...
    }
}

异常状态:

Assembly System 中的 System.Net.AsyncProtocolRequest 类型,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089 未标记为可序列化。

编辑:调用后抛出异常BeginAuthenticateAsClient()SelectLocalCertificate()回调方法被调用,但不是ValidateRemoteCertificate()

新的AppDomainSslWrapper创建如下:

_appDomain = AppDomain.CreateDomain(name, null, new AppDomainSetup { PrivateBinPath = pathToDll });
_wrapper = (SslWrapper)_appDomain.CreateInstanceFromAndUnwrap(pathToDll, typeof(SslWrapper).FullName);
_wrapper.CreateStream(innerStream);

相反,使用同步AuthenticateAsClient()可以成功,在默认的AppDomain.

我假设异常与 AsyncCallback 方法有关。但是,此方法不应该越过 AppDomain 边界,那么为什么我会得到异常呢?更重要的是,能避免吗?

我正在使用 .NET 2,WinXP 64 位。

编辑:这也是 .NET 4 中的一个问题。

4

1 回答 1

0

问题应该出在您的innerStream对象中,它必须是可序列化的或 MarshalByRefObject 才能工作(即能够作为参数跨 AppDomain 边界传递)

于 2012-04-18T10:07:29.110 回答