【问题标题】:Redirect NET CORE HttpResponse to application root将 NET CORE HttpResponse 重定向到应用程序根目录
【发布时间】:2020-11-02 15:32:39
【问题描述】:

我正在使用 Razor Pages,NET CORE 3,为了捕获和处理 404 错误,我实现了以下操作:

app.UseStatusCodePages(context =>
{
    var request = context.HttpContext.Request;
    var response = context.HttpContext.Response;

    if (response.StatusCode == (int)HttpStatusCode.NotFound)
    {
        response.Redirect("./NotFound", false);
    }
    return Task.CompletedTask;
});

它在这里工作:
http://myServer/myApp/nonExistingPage -> http://myServer/myApp/NotFound

在这种情况下显然不起作用:
http://myServer/myApp/doesNotExists/nonExistingPage -> http://myServer/myApp/doesNotExists/NotFound

我读到重定向应该是response.Redirect("~/NotFound", false);。有了这个我得到:

http://myServer/myApp/nonExistingPage -> http://myServer/NotFound
http://myServer/myApp/doesNotExists/nonExistingPage -> http://myServer/NotFound

我错过了什么还是什么?

【问题讨论】:

    标签: redirect root asp.net-core-3.1


    【解决方案1】:

    ./ 表示当前目录。要使用这样的 url 访问NotFound,需要在当前目录中创建该文件。 ~/ 表示网络根路径wwwroot/。可以尝试用这种方式修改。

    response.Redirect("/NotFound", false);
    

    不受目录影响。

    编辑:

    您可以在wwwroot 目录中创建一个文件NotFound.html。发生 404 时重定向到此页面。并且需要修改参数。

     response.Redirect("https://localhost:44344/NotFound.html", false);
    

    或者在服务器的文件夹中创建这个文件,然后在当前项目中重定向到它。

    【讨论】:

    • NotFound.cshtml 放在哪个目录?
    • 我所有的页面都在 {ProjectFolder}/pages 中。但是我对这些东西感到很疯狂,因为本地应用程序在本地主机上运行/一切正常。如果我将它部署在 myServer/myApp/ 上,很多 PageModel::Redirections 会造成麻烦
    • 我已经编辑了这个答案,请检查它是否能满足需求。
    • 感谢您的努力,但我认为这不是一个干净的解决方案。如果我有更多具有不同 NotFound 页面的应用程序怎么办?我找到了一种解决方法,也不是很好,但我想我可以忍受。我会把它作为答案发布。
    【解决方案2】:

    经过长时间的研究,我还没有找到合适的方法来处理它。 作为一种解决方法,我提出了以下解决方案:

    app.UseStatusCodePages(context =>
    {
        var request = context.HttpContext.Request;
        var response = context.HttpContext.Response;
    
        if (response.StatusCode == (int)HttpStatusCode.NotFound)
        {
            if (request.Path.HasValue && request.Path.Value.EndsWith("/NotFound"))
            {
                response.Redirect("../NotFound");
            }
            else
            {
                response.Redirect("./NotFound");
            }
        }
        return Task.CompletedTask;
    });
    

    首先它被重定向到./NotFound。如果重定向的页面也不存在,则意味着我们不在项目的根目录,所以它被再次捕获并重定向到../NotFound,这意味着更少的级别,依此类推,直到找到它(在根目录)。

    如果有人有更好/更好的解决方案,欢迎您发布。

    【讨论】:

      猜你喜欢
      • 2015-05-30
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 2012-02-06
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多