文章出處

回到目錄

對一MVC來說,它有Controller和Action,其中Action用來為頁面提供數據和相關邏輯,并最后將頁面渲染出來,而有些action是需要一些參數的,如文章的最終頁,可能需要一個ID,而這個ID通常是和某個鏈接集成在一起的,不需要瀏覽者手動在URL上改,而有些被稱為無聊的用戶或者馬虎的程序員就把ID參數忽略了,這時,我們的action一般是直接拋出Exception,而這對于一個頁面來說,并不是很優雅,對于一個WEB請求,應該返回一個HttpStatusCodeResult的狀態結果,這個對象在WebApi中使用的比較頻繁.

HttpStatusCodeResult對象結構如下

// 摘要: 
    //     提供一種用于返回帶特定 HTTP 響應狀態代碼和說明的操作結果的方法。
    public class HttpStatusCodeResult : ActionResult
    {
        // 摘要: 
        //     使用狀態代碼初始化 System.Web.Mvc.HttpStatusCodeResult 類的新實例。
        //
        // 參數: 
        //   statusCode:
        //     狀態代碼。
        public HttpStatusCodeResult(HttpStatusCode statusCode);
        //
        // 摘要: 
        //     使用狀態代碼初始化 System.Web.Mvc.HttpStatusCodeResult 類的新實例。
        //
        // 參數: 
        //   statusCode:
        //     狀態代碼。
        public HttpStatusCodeResult(int statusCode);
        //
        // 摘要: 
        //     使用狀態代碼和狀態說明初始化 System.Web.Mvc.HttpStatusCodeResult 類的新實例。
        //
        // 參數: 
        //   statusCode:
        //     狀態代碼。
        //
        //   statusDescription:
        //     狀態說明。
        public HttpStatusCodeResult(HttpStatusCode statusCode, string statusDescription);
        //
        // 摘要: 
        //     使用狀態代碼和狀態說明初始化 System.Web.Mvc.HttpStatusCodeResult 類的新實例。
        //
        // 參數: 
        //   statusCode:
        //     狀態代碼。
        //
        //   statusDescription:
        //     狀態說明。
        public HttpStatusCodeResult(int statusCode, string statusDescription);

        // 摘要: 
        //     獲取 HTTP 狀態代碼。
        //
        // 返回結果: 
        //     HTTP 狀態代碼。
        public int StatusCode { get; }
        //
        // 摘要: 
        //     獲取 HTTP 狀態說明。
        //
        // 返回結果: 
        //     HTTP 狀態說明。
        public string StatusDescription { get; }

        // 摘要: 
        //     通過從 System.Web.Mvc.ActionResult 類繼承的自定義類型,啟用對操作方法結果的處理。
        //
        // 參數: 
        //   context:
        //     用于執行結果的上下文。上下文信息包括控制器、HTTP 內容、請求上下文和路由數據。
        public override void ExecuteResult(ControllerContext context);
    }
View Code

HttpStatusCode是一個枚舉類型,我們經常見到了404,500等HTTP請求碼,都可以在這里枚舉里找到

    // 摘要: 
    //     包含為 HTTP 定義的狀態代碼的值。
    public enum HttpStatusCode
    {
        // 摘要: 
        //     等效于 HTTP 狀態 100。 System.Net.HttpStatusCode.Continue 指示客戶端可能繼續其請求。
        Continue = 100,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 101。 System.Net.HttpStatusCode.SwitchingProtocols 指示正在更改協議版本或協議。
        SwitchingProtocols = 101,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 200。 System.Net.HttpStatusCode.OK 指示請求成功,且請求的信息包含在響應中。 這是最常接收的狀態代碼。
        OK = 200,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 201。 System.Net.HttpStatusCode.Created 指示請求導致在響應被發送前創建新資源。
        Created = 201,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 202。 System.Net.HttpStatusCode.Accepted 指示請求已被接受做進一步處理。
        Accepted = 202,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 203。 System.Net.HttpStatusCode.NonAuthoritativeInformation 指示返回的元信息來自緩存副本而不是原始服務器,因此可能不正確。
        NonAuthoritativeInformation = 203,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 204。 System.Net.HttpStatusCode.NoContent 指示已成功處理請求并且響應已被設定為無內容。
        NoContent = 204,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 205。 System.Net.HttpStatusCode.ResetContent 指示客戶端應重置(或重新加載)當前資源。
        ResetContent = 205,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 206。 System.Net.HttpStatusCode.PartialContent 指示響應是包括字節范圍的 GET
        //     請求所請求的部分響應。
        PartialContent = 206,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 300。 System.Net.HttpStatusCode.MultipleChoices 指示請求的信息有多種表示形式。
        //     默認操作是將此狀態視為重定向,并遵循與此響應關聯的 Location 標頭的內容。
        MultipleChoices = 300,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 300。 System.Net.HttpStatusCode.Ambiguous 指示請求的信息有多種表示形式。 默認操作是將此狀態視為重定向,并遵循與此響應關聯的
        //     Location 標頭的內容。
        Ambiguous = 300,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 301。 System.Net.HttpStatusCode.MovedPermanently 指示請求的信息已移到 Location
        //     頭中指定的 URI 處。 接收到此狀態時的默認操作為遵循與響應關聯的 Location 頭。
        MovedPermanently = 301,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 301。 System.Net.HttpStatusCode.Moved 指示請求的信息已移到 Location 頭中指定的
        //     URI 處。 接收到此狀態時的默認操作為遵循與響應關聯的 Location 頭。 原始請求方法為 POST 時,重定向的請求將使用 GET 方法。
        Moved = 301,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 302。 System.Net.HttpStatusCode.Found 指示請求的信息位于 Location 頭中指定的
        //     URI 處。 接收到此狀態時的默認操作為遵循與響應關聯的 Location 頭。 原始請求方法為 POST 時,重定向的請求將使用 GET 方法。
        Found = 302,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 302。 System.Net.HttpStatusCode.Redirect 指示請求的信息位于 Location 頭中指定的
        //     URI 處。 接收到此狀態時的默認操作為遵循與響應關聯的 Location 頭。 原始請求方法為 POST 時,重定向的請求將使用 GET 方法。
        Redirect = 302,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 303。 作為 POST 的結果,System.Net.HttpStatusCode.SeeOther 將客戶端自動重定向到
        //     Location 頭中指定的 URI。 用 GET 生成對 Location 標頭所指定的資源的請求。
        SeeOther = 303,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 303。 作為 POST 的結果,System.Net.HttpStatusCode.RedirectMethod 將客戶端自動重定向到
        //     Location 頭中指定的 URI。 用 GET 生成對 Location 標頭所指定的資源的請求。
        RedirectMethod = 303,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 304。 System.Net.HttpStatusCode.NotModified 指示客戶端的緩存副本是最新的。 未傳輸此資源的內容。
        NotModified = 304,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 305。 System.Net.HttpStatusCode.UseProxy 指示請求應使用位于 Location 頭中指定的
        //     URI 的代理服務器。
        UseProxy = 305,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 306。 System.Net.HttpStatusCode.Unused 是未完全指定的 HTTP/1.1 規范的建議擴展。
        Unused = 306,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 307。 System.Net.HttpStatusCode.RedirectKeepVerb 指示請求信息位于 Location
        //     頭中指定的 URI 處。 接收到此狀態時的默認操作為遵循與響應關聯的 Location 頭。 原始請求方法為 POST 時,重定向的請求還將使用
        //     POST 方法。
        RedirectKeepVerb = 307,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 307。 System.Net.HttpStatusCode.TemporaryRedirect 指示請求信息位于 Location
        //     頭中指定的 URI 處。 接收到此狀態時的默認操作為遵循與響應關聯的 Location 頭。 原始請求方法為 POST 時,重定向的請求還將使用
        //     POST 方法。
        TemporaryRedirect = 307,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 400。 System.Net.HttpStatusCode.BadRequest 指示服務器未能識別請求。 如果沒有其他適用的錯誤,或者不知道準確的錯誤或錯誤沒有自己的錯誤代碼,則發送
        //     System.Net.HttpStatusCode.BadRequest。
        BadRequest = 400,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 401。 System.Net.HttpStatusCode.Unauthorized 指示請求的資源要求身份驗證。 WWW-Authenticate
        //     頭包含如何執行身份驗證的詳細信息。
        Unauthorized = 401,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 402。 保留 System.Net.HttpStatusCode.PaymentRequired 以供將來使用。
        PaymentRequired = 402,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 403。 System.Net.HttpStatusCode.Forbidden 指示服務器拒絕滿足請求。
        Forbidden = 403,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 404。 System.Net.HttpStatusCode.NotFound 指示請求的資源不在服務器上。
        NotFound = 404,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 405。 System.Net.HttpStatusCode.MethodNotAllowed 指示請求的資源上不允許請求方法(POST
        //     或 GET)。
        MethodNotAllowed = 405,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 406。 System.Net.HttpStatusCode.NotAcceptable 指示客戶端已用 Accept 頭指示將不接受資源的任何可用表示形式。
        NotAcceptable = 406,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 407。 System.Net.HttpStatusCode.ProxyAuthenticationRequired 指示請求的代理要求身份驗證。
        //     Proxy-authenticate 頭包含如何執行身份驗證的詳細信息。
        ProxyAuthenticationRequired = 407,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 408。 System.Net.HttpStatusCode.RequestTimeout 指示客戶端沒有在服務器期望請求的時間內發送請求。
        RequestTimeout = 408,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 409。 System.Net.HttpStatusCode.Conflict 指示由于服務器上的沖突而未能執行請求。
        Conflict = 409,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 410。 System.Net.HttpStatusCode.Gone 指示請求的資源不再可用。
        Gone = 410,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 411。 System.Net.HttpStatusCode.LengthRequired 指示缺少必需的 Content-length
        //     頭。
        LengthRequired = 411,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 412。 System.Net.HttpStatusCode.PreconditionFailed 指示為此請求設置的條件失敗,且無法執行此請求。
        //     條件是用條件請求標頭(如 If-Match、If-None-Match 或 If-Unmodified-Since)設置的。
        PreconditionFailed = 412,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 413。 System.Net.HttpStatusCode.RequestEntityTooLarge 指示請求太大,服務器無法處理。
        RequestEntityTooLarge = 413,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 414。 System.Net.HttpStatusCode.RequestUriTooLong 指示 URI 太長。
        RequestUriTooLong = 414,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 415。 System.Net.HttpStatusCode.UnsupportedMediaType 指示請求是不支持的類型。
        UnsupportedMediaType = 415,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 416。 System.Net.HttpStatusCode.RequestedRangeNotSatisfiable 指示無法返回從資源請求的數據范圍,因為范圍的開頭在資源的開頭之前,或因為范圍的結尾在資源的結尾之后。
        RequestedRangeNotSatisfiable = 416,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 417。 System.Net.HttpStatusCode.ExpectationFailed 指示服務器未能符合 Expect
        //     頭中給定的預期值。
        ExpectationFailed = 417,
        //
        UpgradeRequired = 426,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 500。 System.Net.HttpStatusCode.InternalServerError 指示服務器上發生了一般錯誤。
        InternalServerError = 500,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 501。 System.Net.HttpStatusCode.NotImplemented 指示服務器不支持請求的函數。
        NotImplemented = 501,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 502。 System.Net.HttpStatusCode.BadGateway 指示中間代理服務器從另一代理或原始服務器接收到錯誤響應。
        BadGateway = 502,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 503。 System.Net.HttpStatusCode.ServiceUnavailable 指示服務器暫時不可用,通常是由于過多加載或維護。
        ServiceUnavailable = 503,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 504。 System.Net.HttpStatusCode.GatewayTimeout 指示中間代理服務器在等待來自另一個代理或原始服務器的響應時已超時。
        GatewayTimeout = 504,
        //
        // 摘要: 
        //     等效于 HTTP 狀態 505。 System.Net.HttpStatusCode.HttpVersionNotSupported 指示服務器不支持請求的
        //     HTTP 版本。
        HttpVersionNotSupported = 505,
    }
View Code

讓我們在Action中使用它,看一下程序修改后的樣式吧

    public  ActionResult Details(int? id)
        {
            //參數不正確,直接拋出對應的HttpStatusCodeResult結果
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            //你的邏輯
            return View();
        }

結果截圖

在進行MVC4之后,它同樣支持異步Action,即它在獨立的線程中運行,而不會使用主WEB線程阻塞

   public async Task<ActionResult> Details(int? id)
        {
            //參數不正確,直接拋出對應的HttpStatusCodeResult結果
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            //你的邏輯
            return View();
        }

對于MVC的研究,我們還在繼續,等待MVC5的帶來!

回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()