【问题标题】:Asp net 404 page with parameters带参数的asp net 404页面
【发布时间】:2016-10-07 09:03:25
【问题描述】:

我正在用 asp net mvc 5 开发新网站。我想创建自定义 404 页面,尝试访问旧 url 的用户将被重定向。问题是我想为这个错误页面创建视图并从 url 中获取参数,试图识别用户试图访问的产品。但我还没有找到如何创建它的解决方案。像这样编辑 webconfig 的所有示例:

 <defaultRedirect="~/Errors/NotFound" mode="Off">
          <error statusCode="404" redirect="~/Errors/NotFound" />      
  </customErrors>

不会传递参数。我试图禁用自定义错误并在 Global.asax 中进行更改:

public void Application_Error(object sender, EventArgs e)
        {

            Exception exception = Server.GetLastError();
            Response.Clear();

            HttpException httpException = exception as HttpException;
            if (httpException != null)
            {
                if(httpException.GetHttpCode() == 404)
                {                    
                    var rd = new RouteData();
                    rd.Values["controller"] = "Errors";
                    rd.Values["action"] = "NotFound";
                    rd.Values.Add("queryString", HttpContext.Current.Request.Url.AbsolutePath);

                    IController c = new ErrorsController();
                    c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
                }

            }
        }

但它仍然返回标准错误页面

【问题讨论】:

  • 我以前从未见过这种重定向到错误页面的方式。您是否尝试过使用return RedirectToAction("NotFound", "Errors");
  • 另外,如果您只输入指向错误页面的 URL http://localhost:57623/Errors/NotFound,会发生什么?
  • 我不相信传递参数是有效的(至少不是在所有情况下——请记住,如果错误发生在 IIS 中,重定向会在调用 ASP.NET 之前发生)。但是,this article 会在选项应用于自定义页面和日志记录时对其进行检查。请注意,传递参数是不常见的,因为最佳做法是记录错误并为每个状态代码显示一个通用页面 - 否则黑客可以使用您网站的输出(参数)来查找漏洞。

标签: c# asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

你可以试试这个:

RouteValueDictionary rvd = new RouteValueDictionary(){
{   
    { "Controller", "Errors" },
    { "Action", "NotFound" }
};
rvd["queryString"] = HttpContext.Current.Request.Url.AbsolutePath;
Response.RedirectToRoute(rvd);

希望它有意义。

【讨论】:

  • 不好的是这段代码会返回状态码200
  • 您必须在 ErrorsController NotFound 操作中将状态设置回 404...
  • 会吗?如果 NotFound 操作中有异常,它应该会导致无限循环,因此它应该到达 Application_Error ...。我认为它仅在状态设置为 404 时才有效...
【解决方案2】:

您应该像这样编辑 web.config:

   <system.web>
     <customErrors mode="On" defaultRedirect="~/Error">
      <error redirect="~/Error/NotFound" statusCode="404" />
     </customErrors>
   </system.web>

【讨论】:

    【解决方案3】:

    解决方案比我想象的要容易。当您在 webconfig 中设置自定义错误时

     <defaultRedirect="~/Errors/NotFound" mode="On">
              <error statusCode="404" redirect="~/Errors/NotFound" />      
      </customErrors>
    

    请求的 url 将在 QueryString 中,因此可以像这样获取它:

    public ActionResult NotFound()
            {                
                var requestedString = Request.QueryString["aspxerrorpath"];   
                return View();
            }
    

    【讨论】:

    • 那个 xml 看起来无效。顶部元素应为:&lt;customErrors defaultRedirect="~/Errors" mode="On"&gt;。此外,默认错误页面是“未找到”页面似乎是错误的。我建议您创建一个通用的“发生错误”页面,并为 404 创建一个特定的页面。
    • 还有一件事,在您对 SamGhatak 回答的评论中,您提到在期望 404 时返回状态代码 200。但我认为您的方法也会返回状态代码 200。有几种方法可以返回特定状态码。看看这个问题:stackoverflow.com/questions/2948484/…
    • @LarsKristensen ,大约 404 状态。使用 webconfig 时,Asp net core 手动设置 302 错误,这太可怕了。我查看了您发布的链接,但我不知道我们应该在哪里写来抛出 404 异常,而不是 302 由 asp net core 抛出的错误
    • 状态 302 不是错误,而是用于重定向的状态“找到”,这是您在重定向到错误控制器时所做的(在 Web.config 中,redirectMode 设置为ResponseRedirect 如果您没有明确指定它)。要返回状态为 404 的响应,请将其添加到您的 NotFound 操作中,就在返回视图之前; Response.StatusCode = 404;
    猜你喜欢
    • 2019-11-22
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2015-07-26
    • 2019-10-18
    • 2011-10-30
    • 2020-12-21
    • 2011-12-09
    相关资源
    最近更新 更多