2012-12-03 69 views
2

出於測試目的,我有這樣的方法:HttpNotFoundResult導致HttpException被拋出?

public ActionResult Index() 
{ 
    System.Diagnostics.Debug.Write("Index"); 
    return new HttpNotFoundResult(); 
} 

的方法被調用(「索引」被輸出)。不知何故,這導致HttpException被拋出。在我的Global.asax文件我有一個Application_Error實現:

void Application_Error(object sender, EventArgs e) 
{ 
    Exception exc = Server.GetLastError(); 
    if (exc is System.Web.HttpException) 
    { 
     string msg = "UrlReferrer: " 
      + Context.Request.UrlReferrer + " UserAgent: " + Context.Request.UserAgent 
      + " UserHostAddress: " + Context.Request.UserHostAddress + " UserHostName: " 
      + Context.Request.UserHostName; 

     ErrorHandler.Error(exc.Message, msg); 
    } 
    else { 
     ... 
    } 
} 

這種方法的系統處理請求Index之後被調用。我認爲HttpNotFoundResult會導致異常被拋出 - 或者異常被拋出任何ActionResult與404

這是很煩人的狀態代碼,因爲它是邊踩着我的控制器上的OnException處理程序。對我的網站而言,Application_Error應該是最後一個回退 - 大多數正常的錯誤都是在其他地方處理(通過控制器或動作過濾器)。我只想要Application_Error記錄完全意外的異常,或404s的東西,如圖像或.js文件。

有沒有辦法從投擲程序生成404異常停止asp.net?另外,有沒有一種方法可以確定Application_ErrorHttpException是否是由編程生成的404引起的?

回答

2

您可以創建一個自定義異常過濾器通過處理所有的行動提出了404個例外。您可以使用HttpContext.Items集合來跟蹤它是否通過編程方式提出404。

自定義異常過濾器

public class NotFoundExceptionFilter : IExceptionFilter 
{   
    public void OnException(ExceptionContext filterContext) 
    { 
     // ignore if the exception is already handled or not a 404 
     if (filterContext.ExceptionHandled || new HttpException(null, filterContext.Exception).GetHttpCode() != 404) 
      return; 

     filterContext.HttpContext.Items.Add("Programmatic404", true); 
     filterContext.ExceptionHandled = true; 
    } 
} 

您需要申請NotFoundExceptionFilter作爲一個全球性的過濾器。

Application_Error事件

public static void Application_Error(object sender, EventArgs e) 
{ 
    var httpContext = ((MvcApplication)sender).Context; 

    // ignore if it is a programatically raised 404 
    if(httpContext.Items["Programmatic404"] != null && bool.Parse(httpContext.Items["Programmatic404"].ToString())) 
     return; 

    // else, Log the exception 
} 
+0

這是一個相當不錯的主意,它實際上解決了我的一個不同的問題。但是,asp.net引發的'HttpException'不會到達異常過濾器。看起來異常是從控制器外部拋出的。因此,這個解決方案在這裏不起作用。 – Oliver

+0

@Oliver異常的含義是拋出控制器?我認爲你知道內置的HandleError不能處理除500以外的http異常。 – VJAI

+0

我認爲,在asp.net堆棧中的某個點,檢查一個響應的狀態碼是否爲404,並在這種情況下拋出HttpException。我認爲一旦控制器被使用並被丟棄,就會發生這種情況,因爲'OnException'事件不會觸發它。所以在這裏,你的異常過濾器似乎沒有檢測到'HttpException',因爲它的'OnException'方法沒有被調用。但是,它將檢測從action方法內部手動拋出的HttpException。 – Oliver

相關問題