愛上MVC~為非法進(jin)行Action的用戶提供HttpStatusCodeResult
對一MVC來說,它有Controller和Action,其中(zhong)Action用來為(wei)頁(ye)(ye)面(mian)(mian)提(ti)供數(shu)據(ju)和相關邏輯,并(bing)最后將頁(ye)(ye)面(mian)(mian)渲染出來,而(er)有些action是(shi)(shi)(shi)需要一些參(can)數(shu)的(de)(de),如文章的(de)(de)最終頁(ye)(ye),可能需要一個ID,而(er)這(zhe)個ID通常是(shi)(shi)(shi)和某(mou)個鏈接(jie)集(ji)成在(zai)一起的(de)(de),不需要瀏覽(lan)者(zhe)手動在(zai)URL上改,而(er)有些被稱為(wei)無聊的(de)(de)用戶或者(zhe)馬虎的(de)(de)程序員就把ID參(can)數(shu)忽略了,這(zhe)時,我們的(de)(de)action一般是(shi)(shi)(shi)直接(jie)拋出Exception,而(er)這(zhe)對于(yu)一個頁(ye)(ye)面(mian)(mian)來說,并(bing)不是(shi)(shi)(shi)很(hen)優雅,對于(yu)一個WEB請求(qiu),應該返回一個HttpStatusCodeResult的(de)(de)狀(zhuang)態(tai)結果,這(zhe)個對象在(zai)WebApi中(zhong)使用的(de)(de)比(bi)較頻繁.
HttpStatusCodeResult對象(xiang)結構如下
// 摘(zhai)要: // 提供一種用于返(fan)回帶特定 HTTP 響(xiang)應狀態代(dai)碼和說明的操作結(jie)果的方法。 public class HttpStatusCodeResult : ActionResult { // 摘(zhai)要: // 使用狀(zhuang)態代碼初始(shi)化 System.Web.Mvc.HttpStatusCodeResult 類的新實例。 // // 參數(shu): // statusCode: // 狀態代碼。 public HttpStatusCodeResult(HttpStatusCode statusCode); // // 摘要: // 使(shi)用(yong)狀(zhuang)態代碼初始化 System.Web.Mvc.HttpStatusCodeResult 類的新實例。 // // 參數: // statusCode: // 狀態(tai)代碼。 public HttpStatusCodeResult(int statusCode); // // 摘要: // 使(shi)用狀態(tai)(tai)代碼和狀態(tai)(tai)說明(ming)初始化 System.Web.Mvc.HttpStatusCodeResult 類的(de)新實例。 // // 參數: // statusCode: // 狀態代(dai)碼。 // // statusDescription: // 狀態說明。 public HttpStatusCodeResult(HttpStatusCode statusCode, string statusDescription); // // 摘要(yao): // 使用(yong)狀(zhuang)態代碼和狀(zhuang)態說明初始化 System.Web.Mvc.HttpStatusCodeResult 類的(de)新實(shi)例(li)。 // // 參數: // statusCode: // 狀(zhuang)態代(dai)碼。 // // statusDescription: // 狀態說(shuo)明。 public HttpStatusCodeResult(int statusCode, string statusDescription); // 摘要: // 獲取 HTTP 狀態代(dai)碼。 // // 返回結(jie)果: // HTTP 狀態代碼。 public int StatusCode { get; } // // 摘(zhai)要: // 獲取 HTTP 狀態說明。 // // 返(fan)回結果(guo): // HTTP 狀態說明。 public string StatusDescription { get; } // 摘(zhai)要(yao): // 通過從 System.Web.Mvc.ActionResult 類繼承(cheng)的(de)自(zi)定義類型,啟用(yong)對操(cao)作(zuo)方法結果的(de)處(chu)理。 // // 參數: // context: // 用于執行結果的上下(xia)文(wen)。上下(xia)文(wen)信息包括控(kong)制器(qi)、HTTP 內容、請(qing)求上下(xia)文(wen)和(he)路由數據。 public override void ExecuteResult(ControllerContext context); }
HttpStatusCode是(shi)一(yi)個枚(mei)(mei)舉(ju)類(lei)型,我們經常見到了404,500等HTTP請求(qiu)碼(ma),都可以在(zai)這里(li)枚(mei)(mei)舉(ju)里(li)找到
// 摘要: // 包含為 HTTP 定(ding)義的狀(zhuang)態代(dai)碼(ma)的值。 public enum HttpStatusCode { // 摘(zhai)要: // 等(deng)效于(yu) HTTP 狀態 100。 System.Net.HttpStatusCode.Continue 指示客戶(hu)端可能(neng)繼(ji)續(xu)其請求。 Continue = 100, // // 摘要(yao): // 等效于 HTTP 狀態(tai) 101。 System.Net.HttpStatusCode.SwitchingProtocols 指示正在更改協議版本(ben)或協議。 SwitchingProtocols = 101, // // 摘要(yao): // 等效于 HTTP 狀態 200。 System.Net.HttpStatusCode.OK 指示請求成功,且(qie)請求的信息包(bao)含在響(xiang)應(ying)中。 這是最常接(jie)收的狀態代碼。 OK = 200, // // 摘要(yao): // 等效(xiao)于(yu) HTTP 狀態(tai) 201。 System.Net.HttpStatusCode.Created 指示請求(qiu)導致在響應被(bei)發送前(qian)創建(jian)新資源。 Created = 201, // // 摘要: // 等效于(yu) HTTP 狀態 202。 System.Net.HttpStatusCode.Accepted 指示(shi)請求已被接受做進(jin)一步處理。 Accepted = 202, // // 摘要: // 等效于 HTTP 狀態 203。 System.Net.HttpStatusCode.NonAuthoritativeInformation 指示返回的元信息來自(zi)緩存副本而不是原始服務器(qi),因此可能不正(zheng)確。 NonAuthoritativeInformation = 203, // // 摘(zhai)要: // 等效于(yu) HTTP 狀態(tai) 204。 System.Net.HttpStatusCode.NoContent 指示已成功處理請求并且(qie)響應(ying)已被設(she)定為(wei)無內(nei)容。 NoContent = 204, // // 摘要: // 等效于 HTTP 狀態 205。 System.Net.HttpStatusCode.ResetContent 指示(shi)客戶端應重置(zhi)(或重新加載(zai))當前資源。 ResetContent = 205, // // 摘要: // 等(deng)效于(yu) HTTP 狀(zhuang)態 206。 System.Net.HttpStatusCode.PartialContent 指示響應是包括字節范圍的 GET // 請求(qiu)所請求(qiu)的部分響(xiang)應。 PartialContent = 206, // // 摘要(yao): // 等效于 HTTP 狀態 300。 System.Net.HttpStatusCode.MultipleChoices 指示請求的信(xin)息有多種(zhong)表示形式。 // 默認(ren)操(cao)作是將此(ci)狀(zhuang)態視為重定向,并遵循與此(ci)響應關(guan)聯的 Location 標(biao)頭的內容。 MultipleChoices = 300, // // 摘要: // 等效(xiao)于 HTTP 狀(zhuang)態 300。 System.Net.HttpStatusCode.Ambiguous 指(zhi)示(shi)請求(qiu)的(de)信息有多種表(biao)示(shi)形式。 默認操作是將此狀(zhuang)態視為重定(ding)向(xiang),并遵循與(yu)此響應關聯的(de) // Location 標頭的內容。 Ambiguous = 300, // // 摘要: // 等效于(yu) HTTP 狀態(tai) 301。 System.Net.HttpStatusCode.MovedPermanently 指示請求的信息已移(yi)到 Location // 頭中指定的 URI 處(chu)。 接收到此(ci)狀態(tai)時的默認操(cao)作為遵循與(yu)響應關聯的 Location 頭。 MovedPermanently = 301, // // 摘要: // 等效于 HTTP 狀態 301。 System.Net.HttpStatusCode.Moved 指(zhi)(zhi)示請求的信息已移到 Location 頭(tou)中指(zhi)(zhi)定(ding)的 // URI 處。 接收到此(ci)狀(zhuang)態時的(de)默認(ren)操作(zuo)為遵(zun)循與響應關聯的(de) Location 頭。 原始請求(qiu)方法為 POST 時,重定向的(de)請求(qiu)將使(shi)用 GET 方法。 Moved = 301, // // 摘要: // 等(deng)效于 HTTP 狀(zhuang)態 302。 System.Net.HttpStatusCode.Found 指示請求(qiu)的信息位于 Location 頭中指定的 // URI 處。 接(jie)收到此狀態(tai)時的(de)默(mo)認操作為(wei)遵循與響應關(guan)聯的(de) Location 頭。 原始請求方(fang)(fang)法(fa)為(wei) POST 時,重定向的(de)請求將使用 GET 方(fang)(fang)法(fa)。 Found = 302, // // 摘(zhai)要(yao): // 等(deng)效于(yu) HTTP 狀態 302。 System.Net.HttpStatusCode.Redirect 指(zhi)示請求的信息位于(yu) Location 頭中(zhong)指(zhi)定的 // URI 處。 接收到此狀態(tai)時的(de)默認操作為遵循(xun)與響(xiang)應關聯的(de) Location 頭。 原(yuan)始請求方(fang)法為 POST 時,重定向的(de)請求將使用 GET 方(fang)法。 Redirect = 302, // // 摘要: // 等效于(yu) HTTP 狀態 303。 作為 POST 的結果(guo),System.Net.HttpStatusCode.SeeOther 將客戶端自動重定向到 // Location 頭(tou)中指定的(de)(de) URI。 用 GET 生成對 Location 標(biao)頭(tou)所指定的(de)(de)資源的(de)(de)請求。 SeeOther = 303, // // 摘(zhai)要: // 等效于 HTTP 狀態 303。 作為 POST 的結(jie)果,System.Net.HttpStatusCode.RedirectMethod 將客(ke)戶端自動(dong)重(zhong)定(ding)向(xiang)到(dao) // Location 頭(tou)中指(zhi)定的 URI。 用 GET 生成對 Location 標(biao)頭(tou)所指(zhi)定的資源的請(qing)求(qiu)。 RedirectMethod = 303, // // 摘要: // 等效(xiao)于(yu) HTTP 狀態 304。 System.Net.HttpStatusCode.NotModified 指示客戶(hu)端的(de)緩存副本是最新的(de)。 未(wei)傳輸此(ci)資源的(de)內容(rong)。 NotModified = 304, // // 摘要(yao): // 等效(xiao)于 HTTP 狀(zhuang)態 305。 System.Net.HttpStatusCode.UseProxy 指示請求應使用位于 Location 頭中指定的 // URI 的代理服務(wu)器。 UseProxy = 305, // // 摘要: // 等效于 HTTP 狀(zhuang)態(tai) 306。 System.Net.HttpStatusCode.Unused 是(shi)未(wei)完全指(zhi)定(ding)的(de) HTTP/1.1 規范的(de)建議擴展(zhan)。 Unused = 306, // // 摘要(yao): // 等(deng)效(xiao)于(yu) HTTP 狀態 307。 System.Net.HttpStatusCode.RedirectKeepVerb 指示請求(qiu)信息(xi)位于(yu) Location // 頭中指定的(de)(de) URI 處。 接收(shou)到此狀態時(shi)的(de)(de)默認操作(zuo)為遵循與響應關聯的(de)(de) Location 頭。 原(yuan)始請求方法為 POST 時(shi),重定向的(de)(de)請求還將使用 // POST 方法。 RedirectKeepVerb = 307, // // 摘要: // 等效于 HTTP 狀態 307。 System.Net.HttpStatusCode.TemporaryRedirect 指示請求信息位(wei)于 Location // 頭中指定的(de)(de) URI 處。 接收到此狀態時(shi)的(de)(de)默認操作為遵循與響(xiang)應關(guan)聯的(de)(de) Location 頭。 原始請求方(fang)法為 POST 時(shi),重(zhong)定向(xiang)的(de)(de)請求還將使(shi)用 // POST 方法。 TemporaryRedirect = 307, // // 摘要: // 等效于 HTTP 狀態(tai) 400。 System.Net.HttpStatusCode.BadRequest 指示服務(wu)器未能識別請(qing)求。 如果(guo)沒(mei)有其(qi)他(ta)適用的錯(cuo)誤,或(huo)者(zhe)不(bu)知道準確的錯(cuo)誤或(huo)錯(cuo)誤沒(mei)有自己的錯(cuo)誤代碼(ma),則(ze)發(fa)送(song) // System.Net.HttpStatusCode.BadRequest。 BadRequest = 400, // // 摘要: // 等(deng)效(xiao)于 HTTP 狀態 401。 System.Net.HttpStatusCode.Unauthorized 指示請求(qiu)的資源要求(qiu)身份驗證。 WWW-Authenticate // 頭包含如何執行身份驗證的詳細信息。 Unauthorized = 401, // // 摘要(yao): // 等效于 HTTP 狀態 402。 保留 System.Net.HttpStatusCode.PaymentRequired 以供將來(lai)使用(yong)。 PaymentRequired = 402, // // 摘要: // 等效于 HTTP 狀態 403。 System.Net.HttpStatusCode.Forbidden 指示服務器拒(ju)絕滿足(zu)請求(qiu)。 Forbidden = 403, // // 摘要(yao): // 等效于 HTTP 狀態 404。 System.Net.HttpStatusCode.NotFound 指示請(qing)求(qiu)的資源不在(zai)服務器上。 NotFound = 404, // // 摘要: // 等效(xiao)于 HTTP 狀態(tai) 405。 System.Net.HttpStatusCode.MethodNotAllowed 指示請求(qiu)的資源上(shang)不允許請求(qiu)方法(POST // 或 GET)。 MethodNotAllowed = 405, // // 摘要: // 等效(xiao)于(yu) HTTP 狀(zhuang)態 406。 System.Net.HttpStatusCode.NotAcceptable 指(zhi)示客戶端已(yi)用(yong) Accept 頭指(zhi)示將不(bu)接受資源的任何可(ke)用(yong)表(biao)示形式。 NotAcceptable = 406, // // 摘要(yao): // 等(deng)效于 HTTP 狀(zhuang)態 407。 System.Net.HttpStatusCode.ProxyAuthenticationRequired 指示請(qing)求的(de)代理要(yao)求身(shen)份驗(yan)證。 // Proxy-authenticate 頭包含如何執行(xing)身份驗證的詳(xiang)細信息。 ProxyAuthenticationRequired = 407, // // 摘要: // 等(deng)效(xiao)于 HTTP 狀(zhuang)態 408。 System.Net.HttpStatusCode.RequestTimeout 指示(shi)客戶(hu)端沒(mei)有在服務器期望請(qing)(qing)求(qiu)的時間內發送請(qing)(qing)求(qiu)。 RequestTimeout = 408, // // 摘(zhai)要: // 等效(xiao)于 HTTP 狀態 409。 System.Net.HttpStatusCode.Conflict 指(zhi)示(shi)由于服務(wu)器上的(de)沖突而(er)未(wei)能(neng)執行(xing)請求(qiu)。 Conflict = 409, // // 摘要: // 等效于 HTTP 狀(zhuang)態 410。 System.Net.HttpStatusCode.Gone 指示請求的(de)資(zi)源(yuan)不再可用。 Gone = 410, // // 摘要(yao): // 等效于 HTTP 狀態 411。 System.Net.HttpStatusCode.LengthRequired 指示缺(que)少(shao)必需的 Content-length // 頭。 LengthRequired = 411, // // 摘要: // 等(deng)效于(yu) HTTP 狀(zhuang)態 412。 System.Net.HttpStatusCode.PreconditionFailed 指示為此請(qing)求(qiu)(qiu)設(she)置的條件失敗,且無法執行此請(qing)求(qiu)(qiu)。 // 條件(jian)是用條件(jian)請求(qiu)標頭(如 If-Match、If-None-Match 或 If-Unmodified-Since)設置的。 PreconditionFailed = 412, // // 摘要: // 等效(xiao)于 HTTP 狀態 413。 System.Net.HttpStatusCode.RequestEntityTooLarge 指示請求太大,服務器無法處理。 RequestEntityTooLarge = 413, // // 摘要: // 等效于 HTTP 狀態(tai) 414。 System.Net.HttpStatusCode.RequestUriTooLong 指(zhi)示 URI 太長。 RequestUriTooLong = 414, // // 摘要(yao): // 等(deng)效于(yu) HTTP 狀態(tai) 415。 System.Net.HttpStatusCode.UnsupportedMediaType 指示請求是不(bu)支持的類型。 UnsupportedMediaType = 415, // // 摘(zhai)要(yao): // 等效(xiao)于 HTTP 狀態 416。 System.Net.HttpStatusCode.RequestedRangeNotSatisfiable 指示(shi)無法返回從資(zi)源請求(qiu)的(de)(de)數據范圍,因為范圍的(de)(de)開頭(tou)在(zai)資(zi)源的(de)(de)開頭(tou)之前,或因為范圍的(de)(de)結尾在(zai)資(zi)源的(de)(de)結尾之后(hou)。 RequestedRangeNotSatisfiable = 416, // // 摘(zhai)要: // 等效于(yu) HTTP 狀態 417。 System.Net.HttpStatusCode.ExpectationFailed 指示(shi)服(fu)務(wu)器未(wei)能符合 Expect // 頭(tou)中給定的(de)預期值。 ExpectationFailed = 417, // UpgradeRequired = 426, // // 摘(zhai)要: // 等效于(yu) HTTP 狀態 500。 System.Net.HttpStatusCode.InternalServerError 指示服務(wu)器上發生了一般錯(cuo)誤(wu)。 InternalServerError = 500, // // 摘要: // 等(deng)效于 HTTP 狀態 501。 System.Net.HttpStatusCode.NotImplemented 指示服務器不支持請(qing)求的(de)函數。 NotImplemented = 501, // // 摘要: // 等效于 HTTP 狀態 502。 System.Net.HttpStatusCode.BadGateway 指(zhi)示中間代理服(fu)務(wu)器(qi)從另一代理或(huo)原始服(fu)務(wu)器(qi)接(jie)收到(dao)錯誤響應。 BadGateway = 502, // // 摘要: // 等效于(yu) HTTP 狀態(tai) 503。 System.Net.HttpStatusCode.ServiceUnavailable 指示服(fu)務器暫時(shi)不(bu)可(ke)用,通常(chang)是(shi)由于(yu)過(guo)多加載或(huo)維護。 ServiceUnavailable = 503, // // 摘要: // 等(deng)效于 HTTP 狀態 504。 System.Net.HttpStatusCode.GatewayTimeout 指示(shi)中間(jian)代理(li)服務器(qi)在(zai)等(deng)待(dai)來自另一個代理(li)或原始服務器(qi)的響應時已超時。 GatewayTimeout = 504, // // 摘要: // 等(deng)效于 HTTP 狀態 505。 System.Net.HttpStatusCode.HttpVersionNotSupported 指示服務器不支持(chi)請求的 // HTTP 版本。 HttpVersionNotSupported = 505, }
讓我們在Action中使用它,看一下程序(xu)修改后的樣式吧
public ActionResult Details(int? id) { //參數不正確,直接拋出對應的HttpStatusCodeResult結果 if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } //你的邏輯 return View(); }
結果截圖
在進(jin)行(xing)MVC4之后,它(ta)同樣支持異(yi)步(bu)Action,即它(ta)在獨立的線程(cheng)中(zhong)運行(xing),而不(bu)會使用(yong)主(zhu)WEB線程(cheng)阻塞
public async Task<ActionResult> Details(int? id) { //參數不(bu)正確(que),直接(jie)拋出對應(ying)的HttpStatusCodeResult結果 if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } //你的邏(luo)輯 return View(); }
對于MVC的(de)研究,我們還(huan)在繼續,等待(dai)MVC5的(de)帶來!