Вызов httpclient выдает 404 ответа при использовании OWIN SelfHost - PullRequest
1 голос
/ 17 мая 2019

У меня следующий вызов собственного API OWIN:

const string baseAddress = "http://localhost:9000/";
using (WebApp.Start<ApiSelfHost>(url: baseAddress))
{
    var client = new HttpClient();

    var response = client.GetAsync(baseAddress + "api/v1/orders/test/status").Result;
}

Который основан на ( Я получил, что работает ):

Использование OWIN для самостоятельного размещения веб-API ASP.NET

Ответ возвращает следующее:

StatusCode: 404, ReasonPhrase: «Not Found»

Но если я запускаю реальный API и перехожу на:

http://localhost:51823/api/v1/orders/test/status

Я получил правильный ответ.

Это действие контроллера имеет такую ​​подпись:

[HttpGet]
[Route("api/v1/orders/{orderReference}/status")]
public IHttpActionResult GetOrderStatus([FromUri]string orderReference)

Я пытался изменить этот порт 9000 на 51823, просто чтобы быть уверенным, но это не имеет значения.

У меня установлены следующие OWIN-пакеты:

<package id="Microsoft.Owin" version="4.0.1" targetFramework="net471" />
<package id="Microsoft.Owin.Host.HttpListener" version="4.0.1" targetFramework="net471" />
<package id="Microsoft.Owin.Hosting" version="4.0.1" targetFramework="net471" />
<package id="Microsoft.Owin.Security" version="3.0.1" targetFramework="net471" />
<package id="Microsoft.Owin.Security.Jwt" version="3.0.1" targetFramework="net471" />
<package id="Microsoft.Owin.Security.OAuth" version="3.0.1" targetFramework="net471" />
<package id="Microsoft.Owin.Testing" version="4.0.1" targetFramework="net471" />

Вопрос

Есть ли какие-либо указатели на то, почему URL не может быть найден (бросает 404)?

1 Ответ

2 голосов
/ 17 мая 2019

Через несколько часов у меня все заработало!Как и следовало ожидать, это было что-то более глубокое:

Мой контроллер выдал эту ошибку:

no parameterless constructor defined for this object

Несмотря на настройку регистрации типа IoC:

source.Register(c => MyDbContextMock.Create())
    .AsImplementedInterfaces()
    .InstancePerRequest();

Я былоднако отсутствует эта строка:

source.RegisterApiControllers(typeof(OrderController).Assembly);

Полный запуск настроен с впрыском:

public class ApiSelfHost : Startup
{
    public override 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);
    }
}

Где ConfigureAutofac является расширением HttpConfiguration:

internal static IContainer ConfigureAutofac(this HttpConfiguration source)
{
    var container = new ContainerBuilder()
        .ConfigureAutofac()
        .Build();

    source.ConfigureDependencyInjection(container);

    return container;
}

И еще один ContainerBuilder:

internal static ContainerBuilder ConfigureAutofac(this ContainerBuilder source)
{
    source.RegisterApiControllers(typeof(OrderController).Assembly);

    source.Register(c => MyDbContextMock.Create())
        .AsImplementedInterfaces()
        .InstancePerRequest();

    return source;
}

Startup базовый класс является актуальным из API.

...