如何捕获“从客户端 (:) 检测到潜在危险的 Request.Path 值”以避免 Web 角色崩溃?

Zhi*_*hou 5 c# asp.net asp.net-mvc azure azure-cloud-services

我在 Azure 云服务上运行的 MVC 5 Web 应用程序因未处理的异常“从客户端 (:) 检测到潜在危险的 Request.Path 值”而崩溃。

这次崩溃的原因是某些第三方(可能是恶意的)使用 url 访问了我的端点:http : //myExampleHost.com/m : 443/templates

url 中的冒号无法通过路径验证。

某些答案(从客户端 (*) 检测到潜在危险的 Request.Path 值)建议更改验证规则。然而,出于安全考虑,我们可能不想在这方面妥协。

它的理想行为是:我们捕获异常,记录它并返回一些错误消息而不会崩溃。我们应该怎么做?

一个更普遍的问题是:如何在请求命中 MVC 中的控制器之前捕获异常?

Bru*_*hen 5

它的理想行为是:我们捕获异常,记录它并返回一些错误消息而不会崩溃。我们应该怎么做?

根据我的理解,您可以利用该Application_Error事件来捕获 ASP.NET 中未处理的异常。这是我的测试,你可以参考:

protected void Application_Error()
{
    HttpContext httpContext = HttpContext.Current;
    var exception=Server.GetLastError();
    var httpException = exception as HttpException ?? new HttpException(500, "Internal Server Error", exception);
    var jsonResponse = new
    {
        Message = exception.Message,
        StatusCode = httpException.GetHttpCode(),
        StackTrace=httpException.StackTrace
    };
    httpContext.Response.ContentType = "application/json";
    httpContext.Response.ContentEncoding = Encoding.UTF8;
    httpContext.Response.Write(JsonConvert.SerializeObject(jsonResponse));
    httpContext.Response.End();
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

注意:您还可以重定向到特定的错误页面。

此外,您可以利用customErrorsweb.config 中的 并捕获特定 HTTP 错误代码的错误页面。此外,您可以检查Application_EndRequest事件下的 HTTP 状态代码并编写自定义响应,详细信息可以参考此类似问题。此外,我建议您按照Demystifying ASP.NET MVC 5 Error Pages and Error Logging了解有关错误处理的更多详细信息。