0

我有一个 asp.net MVC Web 应用程序,它使用 jQuery 进行许多 Ajax 调用。ajax 调用一个控制器来捕获存储过程中抛出的各种验证异常。当在过程中发现验证异常时,我使用以下语法

RAISERROR ('VALIDATION ERROR: xyx is required.', 16, 1)

然后,我的 MVC 控制器捕获 SQL 异常,我在其中进行一些日志记录,然后重新抛出一个新异常(e.Message)。

catch (SqlException se)
{
    // logging happens

    // exception get rethrown for ajax error handling
    throw new Exception(se.Message);
 }

从那里,我的 ajax 错误处理程序接管。

error: function(jqXHR, textStatus, errorThrown) {}

在我的本地 Visual Studio Server 中,ajax 错误处理程序检索所需的以下 jqXHR.responseText:

<html>
<head>
    <title>VALIDATION ERROR: xyx is required.</title>
</head>
 ....

从那里我解析标题并显示验证错误。效果很好。

但是,当我将代码部署到托管的 IIS 服务器时,我在 jqXHR.responseText 中得到一个通用的 500 响应:

<html>
<head>
    <title>Runtime Error</title>
</head> ....

出于某种原因,我的共享产品服务器以不同的方式处理异常。你知道我怎样才能让两种环境都产生第一个行为吗?

我尝试在我的 web.config 中添加以下几行,但没有运气

<httpErrors errorMode="Custom" existingResponse="PassThrough">
  <remove statusCode="404" subStatusCode="-1" />
  <remove statusCode="502" subStatusCode="-1" />
  <remove statusCode="501" subStatusCode="-1" />
  <remove statusCode="500" subStatusCode="-1" />
</httpErrors>

提前致谢

4

1 回答 1

0

在 MVC 中正确设置错误处理是一种平衡行为,至少对我来说是这样。在我的情况下,我最终在<system.web><customErrors>和 中定义了自定义错误消息<system.webServer><httpErrors>。然后当然ErrorHandlerElmahErrorHandlerGlobal.asax

我不会假装完全理解它,而是会向您展示我使用的东西。我以为我的应用程序中的某个地方还有一个,但我现在找不到它,您可能会猜到它们的内容的视图,它们大多是静态 HTML,除了可能有模型的 500 个。在这种情况下,我会根据当前用户角色输出一些更详细的错误信息。

我还必须解锁httpErrorsmachine.config 的节点,以便应用程序能够通过 web.config 定义它自己的自定义错误路径。您仍然可以通过 IIS 管理工具(相对于 )设置自己的,但它们实际上是通过匹配应用程序的 IDweb.config来写入的。machine.config

网络配置

<system.web>
    <customErrors mode="RemoteOnly">
      <!-- Off, RemoteOnly, On -->
      <error statusCode="400" redirect="~/errors/badrequest"/>
      <error statusCode="404" redirect="~/errors/notfound"/>
      <error statusCode="403" redirect="~/errors/forbidden"/>
      <error statusCode="500" redirect="~/errors/exception"/>
    </customErrors>
</system.web>

<system.webServer>
    <httpErrors errorMode="DetailedLocalOnly">
      <!-- Detailed, DetailedLocalOnly, Custom -->
      <remove statusCode="400" subStatusCode="-1"/>
      <error statusCode="400" path="/errors/badrequest" responseMode="ExecuteURL"/>
      <remove statusCode="403" subStatusCode="-1"/>
      <error statusCode="403" path="/errors/forbidden" responseMode="ExecuteURL"/>
      <remove statusCode="500" subStatusCode="-1"/>
      <error statusCode="500" path="/errors/exception" responseMode="ExecuteURL"/>
      <remove statusCode="404" subStatusCode="-1"/>
      <error statusCode="404" path="/errors/notfound" responseMode="ExecuteURL"/>
    </httpErrors>
</system.webServer>

全球.asax

filters.Add(new Elmah.Contrib.Mvc.ElmahHandleErrorAttribute());
// -- OR --
filters.Add(new HandleErrorAttribute());

错误控制器

[AllowAnonymous]
public class ErrorsController : WimsController
{
    public ActionResult Index()
    {
        return RedirectToAction("Index", "Home");
    }

    public ActionResult Exception(HandleErrorInfo error = null)
    {
        return View("Error_500", error);
    }

    public ActionResult NotFound()
    {
        return View("Error_404");
    }

    public ActionResult Forbidden()
    {
        return View("Error_403");
    }

    public ActionResult BadRequest()
    {
        return View("Error_400");
    }
}
于 2013-02-11T23:45:49.783 回答