【问题标题】:Why does my Web API return 404 on all resources when called from a Console app?从控制台应用程序调用时,为什么我的 Web API 在所有资源上都返回 404?
【发布时间】:2017-04-27 12:38:30
【问题描述】:

我有一个小的 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 生态系统外部(即 Chrome 中的 PostMan)调用 API 时,一个错误的 url 会导致 404 错误消息,如果还没有跟踪文件,则会创建一个新的跟踪文件。我从 PostMan 用一个好的 url 调用它,我得到了预期的结果,并在跟踪文件中跟踪了请求。

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

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

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

编辑答:这是我使用 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

【问题讨论】:

  • 404 表示找不到服务,这意味着没有人在监听地址/端口。可能是您的测试环境中的某些东西。如果您不使用自托管,则应将该服务部署到 IIS,以便您调用该服务。在这里您应该仔细检查它正在运行的端口。
  • 你能发布一个完整的http请求和响应吗?
  • 尝试使用例如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");
  • 非常感谢@BNK。把它作为一个答案,所以我可以给你一些分数。只需包含链接以及其他答案的摘要即可。

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


【解决方案1】:

根据以下链接中的 Timothy Shields

Why is HttpClient BaseAddress not working?

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

【讨论】:

    猜你喜欢
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2019-10-16
    相关资源
    最近更新 更多