Почему мой веб-API возвращает 404 для всех ресурсов при вызове из консольного приложения?

У меня есть небольшой веб-API, почти прямо из стандартного шаблона проекта VS, то есть контроллеры Home и Values, и много мусора MVC. Он настроен на запуск и отладку под IIS 10.

Я настроил трассировку, добавив пакет Microsoft.AspNet.WebApi.Tracing и следующий код в WebApiConfig:

    public static void Register(HttpConfiguration config)
    {
        config.EnableSystemDiagnosticsTracing();
        SystemDiagnosticsTraceWriter traceWriter = config.EnableSystemDiagnosticsTracing();
        traceWriter.IsVerbose = true;
        traceWriter.MinimumLevel = TraceLevel.Debug;
        config.Services.Replace(typeof(ITraceWriter), new SimpleTracer());
        ...
        ...            
    }

SimpleTracer — это ITraceWriter, который записывает в текстовый файл.

Когда я вызываю API из-за пределов экосистемы VS, то есть из PostMan в Chrome, неверный URL-адрес приводит к сообщению об ошибке 404 и созданию нового файла трассировки, если его еще нет. Я вызываю его из PostMan с хорошим URL-адресом, я получаю ожидаемый результат и трассировку запроса в файле трассировки.

Когда я вызываю его из своего консольного приложения, даже с хорошим URL-адресом, я все равно получаю ответ об ошибке 404, и в файл трассировки ничего не записывается. Я убедился, удалив его, и IIS даже не создает его заново при использовании клиента .exe.

Если я вызываю его из скомпилированного .exe из-за пределов VS, я получаю ту же ошибку.

Затем, когда я настроил веб-API на использование IIS Express, все работает отлично. Нужен ли мне CORS для вызовов из не-веб-приложений, нужен ли в этом случае IIS дополнительный заголовок? Что не так?

EDIT A: Это запрос, когда я использую PostMan, и он возвращает 200 и ожидаемый список строк.

GET /DemoApi/api/values HTTP/1.1
Host: localhost
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: f9454ffc-6a8d-e1ed-1a28-23ed8166e534

и ответ и заголовки:

["value1","value2","value3","value4","value5","value6","value7"]

Cache-Control →no-cache
Content-Length →64
Content-Type →application/json; charset=utf-8
Date →Tue, 13 Dec 2016 06:20:07 GMT
Expires →-1
Pragma →no-cache
Server →Microsoft-IIS/10.0
X-AspNet-Version →4.0.30319
X-Powered-By →ASP.NET

EDIT B: Это запрос, отправленный с помощью HttpClient:

GET http://abbeyofthelema/api/values HTTP/1.1
Accept: application/json
Host: abbeyofthelema
Connection: Keep-Alive

Единственная реальная разница в том, что, поскольку Fiddler не захватывает трафик с локального хоста, вместо этого мне пришлось использовать имя моего компьютера. Тот же получатель по-прежнему получает запрос.

Вот ответ:

HTTP/1.1 404 Not Found
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Date: Tue, 13 Dec 2016 08:07:25 GMT
Content-Length: 4959

person ProfK    schedule 12.12.2016    source источник
comment
404 указывает, что служба не найдена, что означает, что никто не прослушивает адрес/порт. Может быть что-то в вашей тестовой среде. Если вы не используете самостоятельный хостинг, служба должна быть развернута в IIS, чтобы вы могли вызывать службу. Здесь вы должны дважды проверить порт, на котором он работает.   -  person Michael    schedule 12.12.2016
comment
Можете ли вы опубликовать полный HTTP-запрос и ответ, включая заголовки?   -  person matcheek    schedule 12.12.2016
comment
@Michael Я знаю, что такое 404, и я цитирую себя из вопроса: [или] я вызываю его из PostMan с хорошим URL-адресом, я получаю ожидаемый результат.... я могу < b>никогда не получите ожидаемого результата, если API неправильно настроен и прослушивает IIS.   -  person ProfK    schedule 12.12.2016
comment
@matcheek Я опубликовал полный успешный запрос и ответ с заголовками. Это когда я использую PostMan. Я пытаюсь понять, как обрабатывать эти необработанные данные с помощью HttpClient, и опубликую их в ближайшее время.   -  person ProfK    schedule 13.12.2016
comment
Попробуйте использовать, например, client.BaseAddress = new Uri("http://localhost/webapi/");, а затем HttpResponseMessage response = await client.GetAsync("api/values"); вместо client.BaseAddress = new Uri("http://localhost/webapi"); и HttpResponseMessage response = await client.GetAsync("/api/values");   -  person BNK    schedule 13.12.2016
comment
Пожалуйста, прочитайте stackoverflow.com/questions/23438416/   -  person BNK    schedule 13.12.2016
comment
Большое спасибо, @BNK. Сделайте это ответом, чтобы я мог дать вам несколько очков. Просто включите ссылку и краткое изложение того, что говорит другой ответ.   -  person ProfK    schedule 13.12.2016


Ответы (1)


Согласно Тимоти Шилдсу по следующей ссылке

Почему HttpClient BaseAddress не работает?

Вы должны поставить косую черту в конце BaseAddress и не должны ставить косую черту в начале своего относительного URI

person BNK    schedule 14.12.2016