BeginAuthenticateAsClient не работает в новом домене приложений - PullRequest
1 голос
/ 30 января 2012

Я пытаюсь создать объект 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...
    }
}

Состояние исключения:

Тип System.Net.AsyncProtocolRequest в системе сборки, Версия = 2.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089 не помечена как сериализуемая.

Редактировать: Исключение выдается после вызова BeginAuthenticateAsClient().Вызван метод обратного вызова SelectLocalCertificate(), но нет ValidateRemoteCertificate().

Новые AppDomain и SslWrapper создаются следующим образом:

_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 64bit.

Редактировать: Это также проблема в .NET 4.

1 Ответ

0 голосов
/ 18 апреля 2012

проблема должна быть в вашем innerStream объекте, он должен быть сериализуемым или MarshalByRefObject, чтобы работать (т. Е. Иметь возможность передаваться как параметр через границу AppDomain)

...