从控制台应用调用时,为什么我的Web API会在所有资源上返回404?

时间:2016-12-12 15:39:56

标签: asp.net iis asp.net-web-api iis-express iis-10

我有一个小的Web API,几乎直接来自标准的VS项目模板,即HomeValues控制器,以及许多MVC cruft。它设置为在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生态系统外部调用API时,即来自Chrome中的PostMan,一个错误的URL,导致404错误消息,以及创建新的跟踪文件(如果还没有)。我从PostMan用一个好的URL调用它,我得到预期的结果,并在跟踪文件中跟踪请求。

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

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

然后,当我将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没有从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

1 个答案:

答案 0 :(得分:1)

根据以下链接 Timothy Shields

Why is HttpClient BaseAddress not working?

  

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

希望它能帮上忙!