相关疑难解决方法(0)

如何在.NET MVC 2中实现正确的HTTP错误处理?

我一整天都在努力在我的ASP.NET MVC 2应用程序中实现错误处理.我看过各种各样的技术,但都没有正常工作.我正在使用MVC2和.NET 4.0(在MVC3发布之前启动项目;我们将在发布初始版本后进行升级).

在这一点上,我将很乐意正确处理404和500错误 - 403(需要授权)也会很好,其次是各种其他特定的响应.现在,我得到所有404,全部500,全部302在404之前,或者全部302在500之前.

这是我的要求(应该非常接近HTTP的基本要求):

  • 如果找不到资源,则抛出404,并显示包含所请求URL的特定于404的页面.不要返回像302这样的中间响应代码.理想情况下,保留请求的URL,而不是显示新的URL /Error/NotFound,但如果显示后者,请确保我们没有返回重定向响应来获取它.

  • 如果发生内部服务器错误,则抛出500,并显示500特定错误,并指出出现了什么问题.同样,不要返回中间响应代码,理想情况下不要更改URL.

这是我认为的404:

  1. 找不到静态文件: /Content/non-existent-dir/non-existent-file.txt
  2. 未找到控制器: /non-existent-controller/Foo/666
  3. 找到控制器,但未找到操作: /Home/non-existent-action/666
  4. 找到控制器和操作,但操作找不到请求的对象: /Home/Login/non-existent-id

这是我认为的500:

  1. 发布一个不好的价值: POST /User/New/new-user-name-too-long-for-db-column-constraint
  2. 非数据相关问题,如Web服务端点无响应

其中一些问题需要由特定的控制器或模型识别,然后控制器应抛出适当的HttpException.其余的应该更一般地处理.

对于404情况#2,如果找不到控制器,我尝试使用自定义ControllerFactory来抛出404.对于404#3案例,我试图使用自定义基本控制器来覆盖HandleUnknownAction并抛出404.

在这两种情况下,我在404之前得到302.而且,我从来没有得到500个错误; 如果我修改Web.config以在我的Web服务端点中输入拼写错误,我仍然得到302,然后404表示无法找到使用 Web服务的URL(控制器/操作).我还将请求的URL作为(不需要的)查询字符串参数获取:/Error/NotFound?aspxerrorpath=/Home/non-existent-action

这两种技术都来自http://www.niksmit.com/wp/?p=17(如何使用ASP.Net MVC获取正常的404(找不到页面)错误页面),来自http:// richarddingwall .名称/ 2008/08/17 /为基础的战略,为资源-404-错误-在-ASPNET-MVC /

如果在我的Web.config中<customErrors mode="On" defaultRedirect="~/Error/Unknown" redirectMode="ResponseRedirect" />,我得到了相应的响应代码,但我的错误控制器永远不会被调用.取出redirectMode属性可以获得MVC错误视图,但是介入302和更改的URL - 并且始终是相同的控制器(Unknown= 500;如果我将其更改为NotFound一切看起来像404).

以下是我已阅读并尝试实施的其他一些内容:

..以及一堆StackOverflow帖子.

在我看来,这种错误处理对于Web应用程序来说是非常基本的,并且MVC框架应该具有开箱即用的默认设置,并且让人们将其扩展为其他工作.也许他们会在将来的版本中做到这一点.在此期间,有人可以向我提供有关如何实施正确HTTP响应的全面详细信息吗?

error-handling asp.net-mvc http httpresponse asp.net-mvc-2

39
推荐指数
1
解决办法
2万
查看次数

在MVC中返回带有404状态代码的自定义404页面?

我正在尝试使用自定义错误页面返回404状态代码.但是我继续得到200,因为只要浏览器和服务器可以告诉页面确实存在.

到目前为止我一直在尝试的是:

<customErrors mode="On" defaultRedirect="~/404" >
    <error statusCode="404" redirect="~/404"/>
</customErrors>
Run Code Online (Sandbox Code Playgroud)

其中404是指向"未找到页面"控制器和操作的路径.

我也尝试在我的动作中设置状态代码..

public ActionResult PageNotFound(string locale)
{
    Response.StatusCode = 404;
    return View();
}
Run Code Online (Sandbox Code Playgroud)

但这最终只会显示默认的服务器错误页面(灰色的一个带有红色错误消息文本)

有关如何解决这个问题的任何想法?

c# asp.net-mvc custom-error-pages http-status-code-404

9
推荐指数
2
解决办法
4109
查看次数