为什么从控制台应用程序调用我的 Web API return 404 所有资源?

Why does my Web API return 404 on all resources when called from a Console app?

我有一点 Web API,几乎直接来自标准 VS 项目模板,即 HomeValues 控制器,以及许多 MVC 垃圾。设置为 运行 并在 IIS 10 下调试。

我已通过在 WebApiConfig 中添加包 Microsoft.AspNet.WebApi.Tracing 和以下代码来设置跟踪:

    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

当我从 VS 生态系统外部调用 API 时,即从 Chrome 中的 PostMan,错误的 url,导致 404 错误消息,并创建如果还没有一个新的跟踪文件。我从 PostMan 调用它时效果很好 url,我得到了预期的结果,并在跟踪文件中跟踪了请求。

当我从我的控制台应用程序调用它时,即使 url,我仍然收到 404 错误响应,并且没有任何内容写入跟踪文件。我通过删除它来确保在使用 .exe 客户端时 IIS 甚至没有 re-create 它。

如果我从 VS 外部编译的 .exe 调用它,我会得到同样的错误。

然后,当我将 Web API 设置为使用 IIS Express 时,一切正常。来自 non-web 应用程序的调用是否需要 CORS,在这种情况下 IIS 是否需要额外的 header?怎么了?

编辑答: 这是我使用 PostMan 时的请求,它 returns 一个 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

以及响应和 headers:

["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

编辑 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

根据 Timothy Shields 在以下 link

You must place a slash at the end of the BaseAddress, and you must not place a slash at the beginning of your relative URI