1

我有一个小的 Web API,几乎直接来自标准的 VS 项目模板,即HomeValues控制器,以及许多 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写入文本文件的。

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

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

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

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

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

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

1 回答 1

1

根据Timothy Shields在以下链接中的说法

为什么 HttpClient BaseAddress 不起作用?

您必须在 BaseAddress 的末尾放置一个斜杠,并且您不能在您的相对 URI 的开头放置一个斜杠

于 2016-12-14T02:30:57.703 回答