Фон
У меня есть модульный тест, который настраивает OWIN SelfHost для моего REST API:
[Fact]
public void My_Test()
{
const string baseAddress = "http://localhost:9000/";
using (WebApp.Start<ApiSelfHost>(url: baseAddress))
{
var client = new HttpClient();
var response = client.GetAsync(baseAddress + "api/test").Result;
_output.WriteLine($"Status code: {response.StatusCode}");
response.IsSuccessStatusCode.ShouldBeTrue();
}
}
ApiSelfHost
настроен так:
public class ApiSelfHost
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
var httpConfiguration = new HttpConfiguration();
var container = httpConfiguration.ConfigureAutofac();
app.UseAutofacMiddleware(container);
app.UseAutofacWebApi(httpConfiguration);
app.UseWebApi(httpConfiguration);
}
}
Autofac настроен так:
internal static IContainer ConfigureAutofac(this HttpConfiguration source)
{
var container = new ContainerBuilder()
.ConfigureAutofac()
.Build();
source.ConfigureDependencyInjection(container);
return container;
}
И
internal static ContainerBuilder ConfigureAutofac(this ContainerBuilder source)
{
source.RegisterApiControllers(typeof(MyController).Assembly);
source.Register(c => MyContextMock.Create())
.AsImplementedInterfaces()
.InstancePerRequest();
return source;
}
Действие контроллера очень просто, просто проверка, чтобы увидеть, если контроллерударил:
[HttpGet]
[Route("api/test")]
public IHttpActionResult RunTest()
{
return Ok();
}
К сожалению, точка останова в этом методе НЕ достигнут.
Симптомы
Если я запускаю тест в Debug, яполучите это исключение ошибки:
System.Net.HttpListenerException HResult = 0x80004005 Сообщение = Операция ввода-вывода была прервана из-за выхода из потока или запроса приложения Source = System StackTrace: at System.Net.HttpListener.EndGetContext (IAsyncResult asyncResult)
На черной странице с именем System.pdb не загружен .
Стоп вызова находится глубоко внутри mscorlib.ddl иЯ думаю, что не очень важно выяснить, где проблема возникает:
Если я запускаю тест напрямую, я получаю странный результат:
Вопрос
Что происходит и что я могу сделать, чтобы это исправить?
ОБНОВЛЕНИЕ
У меня есть некоторый прогресс, я пыталсявоссоздать проблему в изолированном проекте, который работал.Я также нашел способ исправить этот изолированный проект:
Если я инициализирую свой контроллер напрямую, вот так:
var ctrl = new MyController();
Он работает, потому что сборка контроллера активно вызывается.Тем не менее, я не могу сделать эту работу для фактического решения этого вопроса.Я продолжаю искать ...