加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – MVC:404路由在生产中无法正常工作

发布时间:2020-12-16 03:26:35 所属栏目:asp.Net 来源:网络整理
导读:我在global.asax的底部有以下路由: //404 ERRORS:routes.MapRoute( "404-PageNotFound","{*url}",new { controller = "Error",action = "PageNotFound" }); 哪个在Visual Studio中工作正常,但在生产中我得到了IIS错误页面. 这条路线不应该捕获任何未被其他
我在global.asax的底部有以下路由:

//404 ERRORS:
routes.MapRoute(
    "404-PageNotFound","{*url}",new { controller = "Error",action = "PageNotFound" }
);

哪个在Visual Studio中工作正常,但在生产中我得到了IIS错误页面.

这条路线不应该捕获任何未被其他人捕获的URL,因此从IIS的角度来看没有404吗?我还需要在web.config中做些什么吗?

注意:我不想重定向到特定于404的URL;而是我在请求的URL上提供404错误页面(我认为从可用性的角度来看这是正确的方法).

UPDATE
在我的错误控制器中,我正在设置Response.StatusCode = 404;,这似乎是个问题.当我删除它并再次部署到生产时,我再次获得友好的错误页面.但是,我相信我确实需要HTTP标头中的404状态 – 出于搜索引擎优化的目的 – 所以现在我的问题变为:

修订过的问题
如何/为什么IIS拦截响应并发送其开箱即用的404错误,我该如何防止这种情况?

**解**
Dommer获得建议Response.TrySkipIisCustomErrors = true的奖励; (我认为)是必要的.但还有另外两个关键细节:

> web.config(duh!)中需要启用自定义错误
> 404操作必须具有[HandleErrors]属性.

让它无处不在
由于某些URL可能会映射到“404-PageNotFound”以外的路由但包含无效参数,并且由于我不想重定向到404页面,因此我在基本控制器中创建了此操作:

[HandleError]
public ActionResult NotFound()
{
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true;     
    return View("PageNotFound",SearchUtilities.GetPageNotFoundModel(HttpContext.Request.RawUrl));          
}

并且在任何继承基础的控制器动作中,每当我捕获无效的路由参数时,我只需要调用它:

return NotFound();

注意:不是RedirectToAction()

蛋糕上的结冰:
我生成并传递到视图中的模型是关于将URL的罗嗦位添加到我们的搜索引擎中,并在友好的404页面上显示前3个结果作为建议.

解决方法

问题是您的请求与之前的某个路由匹配,然后失败.一种可能的解决方案是尝试约束其他路由,如下所示:

// This will match too many things,so let's constrain it to those we know are valid
   routes.MapRoute(
    "Default","{controller}/{action}/{id}",new { controller = "Home",action = "Index",id = UrlParameter.Optional },new { controller = "Home|OtherController|AnotherController|..." } // regular expression matching all valid controllers
);

//404 ERRORS:
routes.MapRoute(
    "404-PageNotFound",action = "PageNotFound" }
);

如果你想要一个更全面的答案,那么看看这个:How can I properly handle 404 in ASP.NET MVC?

编辑:

要摆脱自定义IIS错误,请尝试将错误控制器更改为:

Response.StatusCode = 404;
Response.TrySkipIisCustomErrors=true; // add this line

MSDN doc:http://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors.aspx

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读