Создание экземпляра HttpClient в другом домене - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь создать экземпляр httpclient в другом домене приложения. Но я получаю исключение при попытке создать экземпляр WebRequestHandler.

Вот мой код:

public class CipHandler : IDisposable
{
    private readonly HttpClient _client;
    private readonly WebRequestHandler _clientHandler;
    private readonly X509Store _certStore;
    private AppDomain _closedDomain;
....some other properties

    private void CreateDomain()
    {
        AppDomainSetup ads = new AppDomainSetup();
        ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;

        ads.DisallowBindingRedirects = false;
        ads.DisallowCodeDownload = true;
        ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

        _closedDomain = AppDomain.CreateDomain("Closed Secure Domain", null, ads);
    }

    public CipHandler()
    {
        var certificate = GetCert();

        CreateDomain(); 

        _clientHandler = (WebRequestHandler)_closedDomain.CreateInstanceAndUnwrap(typeof(WebRequestHandler).Assembly.FullName, typeof(WebRequestHandler).FullName);  <<<<<EXCEPTION IS HERE
        _clientHandler.AutomaticDecompression = System.Net.DecompressionMethods.Deflate | System.Net.DecompressionMethods.GZip;
        _clientHandler.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; 
        _clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
        _clientHandler.ClientCertificates.Add(certificate);

        _client = (HttpClient)_closedDomain.CreateInstanceAndUnwrap(typeof(HttpClient).Assembly.FullName, typeof(HttpClient).FullName, new object[] { _clientHandler });
        _client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/xml"));

        OpenMarket = (OpenMarket)_closedDomain.CreateInstanceAndUnwrap(typeof(VoRoamInfo).Assembly.FullName, typeof(VoRoamInfo).FullName, new object[] { _client, certificate });
        VoFupInfo = (VoFupInfo)_closedDomain.CreateInstanceAndUnwrap(typeof(VoRoamInfo).Assembly.FullName, typeof(VoRoamInfo).FullName, new object[] { _client, certificate });
        VoRoamInfo = (VoRoamInfo)_closedDomain.CreateInstanceAndUnwrap(typeof(VoRoamInfo).Assembly.FullName, typeof(VoRoamInfo).FullName,new object[] { _client, certificate });
    }

Исключение составляет: Тип 'System. Net .Http.WebRequestHandler' в сборке 'System . Net .Http.WebRequest, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a 'не помечена как сериализуемая.

Может ли кто-нибудь помочь мне разобраться в этой проблеме? Есть ли другой способ достижения httpclient на другом домене приложения?

1 Ответ

1 голос
/ 17 марта 2020

Чтобы иметь возможность создать объект в другом AppDomain, тип экземпляра должен быть либо 1) получен из MarshalByRefObject, либо 2) помечен как Serializable с SerializableAttribute.

[Serializable]
public class SerializableClass
{
}

Исключением является то, что WebRequestHandler не является ни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...