【问题标题】:How to intercept a 404 Not Found using the OWIN pipeline如何使用 OWIN 管道拦截 404 Not Found
【发布时间】:2014-04-25 06:10:22
【问题描述】:

我还有一个关于 Web-API 和 OWIN 的问题。我正在“玩”它,试图了解它,我想看看我是否可以从 web api 的“返回”中截获 404。

所以,我的 Startup 中有以下内容..

app.Use(async (environment, next) =>
      {       
        Debug.WriteLine(environment.Request.Uri);
        await next();   
        Debug.WriteLine(environment.Response.StatusCode);
      });

  HttpConfiguration config = new HttpConfiguration();
  WebApiConfig.Register(config);
  app.UseWebApi(config);

然后我使用无效的 URI 执行 GET(在浏览器中),以便得到 404 结果。我希望将其视为 Debug.WriteLine(environment.Response.StatusCode) 中写出的状态代码

但是,我所看到的(在 dev studio 输出窗口中,因为我正在运行 IIS express)是

http://localhost:55905/myresource
http://localhost:55905/myresource
200
200

我真的很期待那里的 404。

有人知道为什么我们没有看到 404 回来吗?

我查看了响应,但在任何地方都看不到。

提前感谢您的帮助!

【问题讨论】:

  • 401 = 未经授权。 404 = 未找到。
  • 卫生署!是的,我的标题有误。我的意思是 404。修复了标题,但问题仍然存在 干杯
  • @peterc 你有没有弄清楚这里发生了什么?我遇到了类似的问题。
  • @Joshua Barron 不,我从来没有发现这一点。我仍然想知道的东西,将不得不尽快回到它。如果你先发现,我会很感兴趣的。

标签: asp.net-mvc owin asp.net-web-api2


【解决方案1】:

/myresource 是有效的 webapi 路由吗? 我认为(但我不确定)您的请求是由 IIS 直接处理的,而忽略了 owin 管道。但我不知道为什么它以 200 响应。 你可以很容易地测试它。 假设您的代码和以下配置:

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        config.Routes.MapHttpRoute(
            name: "API Default",
            routeTemplate: "api/{controller}/{id}",
            defaults: new {id = RouteParameter.Optional}
            );
    }
}

并稍微修改了您的 Startup 类:

app.Use(async (environment, next) => {
    Debug.WriteLine(environment.Request.Uri);

    environment.Response.OnSendingHeaders(_ => {
        var resp = ((IOwinResponse) _);
        Debug.WriteLine("Headers are send!: {0}", resp.StatusCode);
        resp.Headers.Add("X-MyTag", new[] {"Nice value!"});

    }, environment.Response);
    await next();
    Debug.WriteLine(environment.Response.StatusCode);
});

样品控制器:

public class ValuesController : ApiController {
    // GET api/<controller>
    public IEnumerable<string> Get() {
        return new string[] { "value1", "value2" };
    }
}

现在 OWIN 管道应该在每个请求中返回一个自定义标头 X-MyTag。 我正在使用Fiddler 来检查我的请求。

http://localhost:13543/ 的请求响应时没有我的标头。所以它不是由 owin 管道提供的。 另一方面,对http://localhost:13543/api/Values 的请求以 200 和我的自定义标头响应。

http://localhost:13543/api/Values1 的(无效)请求以 404 响应,包括我的自定义标头,您可以在输出控制台中看到此 404。

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 2015-06-27
    • 2013-04-07
    • 2021-10-17
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    相关资源
    最近更新 更多