【问题标题】:How to handle page not found error in OWIN Katana?如何处理 OWIN Katana 中的找不到页面错误?
【发布时间】:2015-10-09 09:08:02
【问题描述】:

假设我有 hotfound.html 页面,我想在找不到页面(或 wab api 方法)时显示它。

如何在 OWIN 应用程序中处理它?

谢谢

【问题讨论】:

    标签: .net http-status-code-404 asp.net-web-api owin katana


    【解决方案1】:

    您可以制作一个 OwinMiddleware 来重定向 NotFound 响应(或任何其他响应)。

    class NotFoundMiddleware : OwinMiddleware
    {
        public NotFoundMiddleware(OwinMiddleware next, IAppBuilder app)
            : base(next)
        {
        }
    
        public override async Task Invoke(IOwinContext context)
        {
            await Next.Invoke(context);
    
            if (context.Response.StatusCode == 404)
            {
                context.Response.Redirect("notfound.html");
            }
        }
    }
    

    或直接在响应正文中返回 html(即不重定向)。

    public override async Task Invoke(IOwinContext context)
        {
            await Next.Invoke(context);
            if (context.Response.StatusCode == 404)
            {
                using (StreamWriter writer = new StreamWriter(context.Response.Body))
                {
                    string notFound = File.ReadAllText(@"Web\notfound.html");
                    writer.Write(notFound);
                    writer.Flush();
                }
            }
        }
    

    请注意,您可能需要根据您的具体情况另外编辑响应,但这适用于我的简单 Owin 服务器。

    然后在 Startup.cs 中添加

     app.Use<NotFoundMiddleware>(app);
    

    【讨论】:

    • 哦,太好了,谢谢,这行得通。有没有办法在没有重定向的情况下显示未找到的页面?即不改变浏览器中的url?
    • 您可能希望以相同的方式拦截 404 状态,但您将修改响应正文以包含一些基本的 html(未找到的页面),而不是重定向。如果您查看来自 www.google.com/foo 的响应,这就是他们显示 404 页面的方式。
    • 好的,知道我可以修改响应体返回文本响应,但是此时没有办法返回html文件吗?
    • 我发现这不起作用,因为如果没有控制器,那么调用await Next.Invoke(context) 将导致错误在我调用重定向之前被传递回用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2015-08-10
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多