2016-12-12 12 views
1

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

Я настроил отслеживание, добавив пакет 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-интерфейс Web для использования 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 

Единственное реальное отличие заключается в том, что из-за Скрипач Безразлично» t захватить трафик с localhost, я должен был использовать свое имя компьютера вместо этого. Тот же получатель все еще получает запрос.

Ответ здесь:

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 
+0

404 заявляет, что служба не найдена, что означает, что никто не прослушивает адрес/порт. Может быть что-то в вашей тестовой среде.Если вы не используете самостоятельный хостинг, служба должна быть развернута в IIS, чтобы вы могли позвонить службе. Здесь вы должны дважды проверить порт, на котором он запущен. – Michael

+0

Можете ли вы опубликовать полный HTTP-запрос и ответ, включая заголовки? – matcheek

+0

@ Майкл Я знаю, что такое 404, и я цитирую себя из вопроса: «Из [или] я называю это из PostMan с хорошим URL-адресом **, я получаю ожидаемый результат ** ...». Я могу * * never ** получить ожидаемый результат, когда API неправильно настроен и прослушивается в IIS. – ProfK

ответ

1

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

Why is HttpClient BaseAddress not working?

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

Надеюсь, это поможет мало!