自定义应用程序错误 - ASP MVC

时间:2017-06-27 15:07:31

标签: asp.net asp.net-mvc vb.net exception-handling

我试图在网络应用中处理例外工作,我工作正常,直到我点击" http://localhost:52183/Usuario/InsertarUsuario/89之类的网址。" 并在visual studio上显示此错误:

  

system.web上发生了类型system.web.httpexception的异常但在用户代码中没有处理。

Show Error

我想做什么?

如果页面不存在,则显示404页面

在其他情况下,显示一般错误。

Global.asax.vb中的代码

Imports System.Web.Http

Public Class MvcApplication
    Inherits System.Web.HttpApplication

Sub Application_Start()
    AreaRegistration.RegisterAllAreas()

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters)
    RouteConfig.RegisterRoutes(RouteTable.Routes)
End Sub

Protected Sub Application_Error(sender As Object, e As EventArgs)

    Dim ex As Exception = Server.GetLastError()
    Dim httpContext = DirectCast(sender, MvcApplication).Context
    Dim httpEx = TryCast(ex, HttpException)

    Response.Clear()


    If (httpEx Is Nothing Or httpEx.Message = "") Then
        httpEx = New HttpException(500, "Error interno de servidor", ex)
        Response.Redirect("~/Error/PeticionInvalida")
    End If

    If (TypeOf ex Is HttpException) Then

        If (httpEx.GetHttpCode = "404") Then
            Response.Redirect("~/Error/NoEncontrado")

        Else
            Response.Redirect("~/Error/PeticionInvalida")
        End If
    End If
    Server.ClearError()

End Sub

End Class

我做错了什么?或者我将如何处理这些错误?

提前感谢您提供给我的信息。

1 个答案:

答案 0 :(得分:0)

我喜欢在web.config中使用httpErrors。它是一个IIS设置,因此您必须将其放在web.config的system.webserver部分中。由于它是IIS级别设置,因此可以很好地捕获404 - 尤其是那些与您的任何路线都不匹配的设备。

以下是我在项目中使用的代码:

<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="400" subStatusCode="-1" />
  <remove statusCode="403" subStatusCode="-1" />
  <remove statusCode="404" subStatusCode="-1" />
  <remove statusCode="500" subStatusCode="-1" />
  <error statusCode="400" path="/Error/BadRequest" responseMode="ExecuteURL"/>
  <error statusCode="403" path="/Error/NotAuthorized" responseMode="ExecuteURL" />
  <error statusCode="404" path="/Error/NotFound" responseMode="ExecuteURL" />
  <error statusCode="500" path="/Error" responseMode="ExecuteURL" />
</httpErrors>

remove标记用于删除任何继承的设置(例如,来自machine.config)。

对于每个错误代码,我只是执行控制器操作。在我的控制器操作中,我还相应地设置了http响应代码,以便浏览器知道错误 - 这样做是件好事,谷歌等索引器不会将您的错误页面编入索引。

更新7-4-2017:这是我使用的错误控制器:

[AllowAnonymous]
public class ErrorController : Controller
{
    public ActionResult Index()
    {
        Response.StatusCode = 500;
        return View("Error");
    }

    public ViewResult BadRequest()
    {
        Response.StatusCode = 400;
        return View("BadRequest");
    }

    public ViewResult NotFound()
    {
        Response.StatusCode = 404;
        return View("NotFound");
    }

    public ViewResult NotAuthorized()
    {
        Response.StatusCode = 403;
        return View("NotAuthorized");
    }
}