Я использую xunit для написания некоторых модульных тестов, которые будут тестировать подкласс HttpClient
, который я написал, который также использует DelegateHandler
.Я пытаюсь использовать HttpMessageHandler
, чтобы высмеивать ответы, которые я получу от звонков Get / Post на HttpClient
.Я передаю обработчик сообщений в конструктор моего обработчика удаления через вызов HttpClientHandler.CreatePipeline()
.Однако, когда я запускаю модульный тест, я получаю следующее исключение:
System.TypeAccessException : Attempt by security transparent method 'System.Net.Http.HttpClientFactory.CreatePipeline(System.Net.Http.HttpMessageHandler, System.Collections.Generic.IEnumerable`1<System.Net.Http.DelegatingHandler>)' to access security critical type 'System.Net.Http.HttpMessageHandler' failed.
Stack Trace:
at System.Net.Http.HttpClientFactory.CreatePipeline(HttpMessageHandler innerHandler, IEnumerable`1 handlers)
Мой конструктор выглядит так:
public MyHttpClient(HttpMessageHandler handler) :
base(HttpClientFactory.CreatePipeline(
new HttpClientHandler(),
new[]
{
new MyDelegateHandler(handler)
}))
{ }
Конструктор для моего обработчика делегата:
public MyDelegateHandler(HttpMessageHandler messageHandler) :
base(messageHandler)
{ }
И некоторый код из моего модульного теста:
var handler = new MyMessageHandler("response content");
MyHttpClient client = new MyHttpClient(handler);
var task = client.GetAsync("https://example.com");
(обратите внимание, что исключение происходит до того, как я позвоню GetAsync()
)
Я попытался добавить атрибуты безопасности для всехмои вызовы, включая метод, запускающий модульное тестирование (из этого вопроса: Попытка прозрачного метода безопасности X для доступа к критическому методу безопасности Y завершилась неудачно )
Я также протестировал, удаливполностью делегировать обработчик и передать обработчик сообщений непосредственно в конструктор MyHttpClient
, и это прекрасно работает.
Я также попытался добавить любое число / комбинацию следующих атрибутов в файлы AssemblyInfo.cs
:
[assembly: SecurityRules(SecurityRuleSet.Level1)]
[assembly: AllowPartiallyTrustedCallers]
[assembly: SecurityTransparent()]
Что еще я могу сделать, чтобы обойти исключение доступа?Я хотел бы иметь возможность проверить обработчик делегата.
ОБНОВЛЕНИЕ: Похоже, я получаю это исключение, независимо от того, передаю ли я обработчик сообщений или нет.Простой вызов метода CreatePipeline()
вызывает это исключение.