2011-08-23 74 views
6

我想驗證服務收到的HTTP請求。我想檢查是否存在所有必需的頭文件等。如果不是,我想拋出一個異常,這將在某個地方設置響應的正確響應代碼和狀態行。我不想將用戶重定向到任何特定的錯誤頁面,只是發送答案。在Global.asax中驗證HTTP請求並返回特定HTTP響應的正確方法是什麼?

我想知道我應該把代碼放在哪裏?我的第一個猜測是驗證Application_BeginRequest中的請求,拋出異常並在Application_Error中處理它。

例如:

public void Application_BeginRequest(object sender, EventArgs e) 
{ 
    if(!getValidator.Validate(HttpContext.Current.Request)) 
    { 
     throw new HttpException(486, "Something dark is coming"); 
    } 
} 

public void Application_Error(object sender, EventArgs e) 
{ 
    HttpException ex = Server.GetLastError() as HttpException; 
    if (ex != null) 
    { 
      Context.Response.StatusCode = ex.ErrorCode; 
      Context.Response.Status = ex.Message; 
    } 
} 

顯然,在這種情況下,Visual Studio中抱怨在Application_BeginRequest未處理的異常。它可以工作,因爲給定的代碼被返回給客戶端,但是我覺得這種方法有些問題。

[編輯]: 我已經刪除了關於自定義狀態行的第二個問題,因爲這些問題沒有真正連接。

感謝您的幫助。

+0

WCF從哪裏進場?您是否構建了在IIS中託管的REST服務? –

+0

嗯,是的。我相信這是其中一種選擇,反對託管服務作爲託管的Windows服務/託管應用程序(根據msdn) –

回答

6

當引發異常時,Visual Studio默認會中斷執行。您可以通過轉到Debug - > Exceptions來更改此行爲,並取消選中公共語言運行時異常旁邊的複選框。然而,這裏的主要問題是你正在拋出一個異常,以便你可以捕獲它並在響應中設置狀態碼。你可以做到這一點,而不會拋出異常。例如 void Application_BeginRequest(object sender, EventArgs e) { if(!getValidator.Validate(HttpContext.Current.Request)) { HttpContext.Current.Response.StatusCode = 403 var httpApplication = sender as HttpApplication; httpApplication.CompleteRequest(); } }

+0

解決了我的問題,非常感謝! –