在我的一個Asp.Net Core 2.1 的項目中,我們需要通過獲得服務器返回的狀態,去實現不用的操作,經過多方資料查詢和實踐,個人總結一種方法
一、修改控制器
在要返回值的控制器Action中,Return前添加如下一行
Response.StatusCode = (int)HttpStatusCode.Created;
添加后的結果為:
public IActionResult Contact()
{
ViewData["Message"] = "Your contact page.";
Response.StatusCode = (int)HttpStatusCode.Created;
return View();
}
二、修改鏈接
<ul> <li><a asp-action="Contact" id="view2">測試返回狀態碼</a></li> <li id="result"><a href="#">結果顯示在這里</a></li> </ul>
三、修改jQuery
$("#view2").on("click", function(ev) { ev.preventDefault(); //關閉默認的鏈接動作 var $url = $(this).attr("href"); $.ajax({ url: $url, error: function (xhr) { $("#result a").text("this is a error:" + xhr.status); }, success: function (data, status,xhr) { if (xhr.status === 201) { $("#result a").text("創建成功"); } else { $("#result a").text("創建失敗"+xhr.status); } } }); });
此時:data為返回的結果,status為XHR的文字狀態success
四、HTTP協議狀態碼:
在System.Net中定義了一系列的狀態碼
namespace System.Net { /// <summary>Contains the values of status codes defined for HTTP.</summary> public enum HttpStatusCode { Continue = 100, // 0x00000064 (繼續) 請求者應當繼續提出請求。 服務器返回此代碼表示已收到請求的第一部分,正在等待其余部分。 SwitchingProtocols = 101, // 0x00000065 (切換協議) 請求者已要求服務器切換協議,服務器已確認並准備切換。 Processing = 102, // 0x00000066 (處理中) EarlyHints = 103, // 0x00000067 (預提示) // 2xx (成功)表示成功處理了請求的狀態代碼。 OK = 200, // 0x000000C8 (成功) 服務器已成功處理了請求。 通常,這表示服務器提供了請求的網頁。 Created = 201, // 0x000000C9 (已創建) 請求成功並且服務器創建了新的資源。 Accepted = 202, // 0x000000CA (已接受) 服務器已接受請求,但尚未處理。 NonAuthoritativeInformation = 203, // 0x000000CB (非授權信息) 服務器已成功處理了請求,但返回的信息可能來自另一來源。 NoContent = 204, // 0x000000CC (無內容) 服務器成功處理了請求,但沒有返回任何內容。 ResetContent = 205, // 0x000000CD (重置內容) 服務器成功處理了請求,但沒有返回任何內容。 PartialContent = 206, // 0x000000CE (部分內容) 服務器成功處理了部分 GET 請求。 MultiStatus = 207, // 0x000000CF AlreadyReported = 208, // 0x000000D0 IMUsed = 226, // 0x000000E2 // 3xx (重定向)表示要完成請求,需要進一步操作。 通常,這些狀態代碼用來重定向。 Ambiguous = 300, // 0x0000012C MultipleChoices = 300, // 0x0000012C (多種選擇)針對請求,服務器可執行多種操作。 服務器可根據請求者 (user agent) 選擇一項操作,或提供操作列表供請求者選擇。 Moved = 301, // 0x0000012D (永久移動) 請求的網頁已永久移動到新位置。 服務器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。 MovedPermanently = 301, // 0x0000012D (臨時移動) 服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以后的請求。 Found = 302, // 0x0000012E (已找到) Redirect = 302, // 0x0000012E (重定向) RedirectMethod = 303, // 0x0000012F (重定向到方法) SeeOther = 303, // 0x0000012F (查看其他位置) 請求者應當對不同的位置使用單獨的 GET 請求來檢索響應時,服務器返回此代碼。 NotModified = 304, // 0x00000130 (未修改) 自從上次請求后,請求的網頁未修改過。 服務器返回此響應時,不會返回網頁內容。 UseProxy = 305, // 0x00000131 (使用代理) 請求者只能使用代理訪問請求的網頁。 如果服務器返回此響應,還表示請求者應使用代理。 Unused = 306, // 0x00000132 (未使用) RedirectKeepVerb = 307, // 0x00000133 (保持動作的重定向) TemporaryRedirect = 307, // 0x00000133 (臨時重定向) 服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以后的請求。 PermanentRedirect = 308, // 0x00000134 (永久性重定向) // 4xx(請求錯誤)這些狀態代碼表示請求可能出錯,妨礙了服務器的處理。 BadRequest = 400, // 0x00000190 (錯誤請求) 服務器不理解請求的語法。 Unauthorized = 401, // 0x00000191 (未授權) 請求要求身份驗證。 對於需要登錄的網頁,服務器可能返回此響應。 PaymentRequired = 402, // 0x00000192 (支付請求) Forbidden = 403, // 0x00000193 (禁止) 服務器拒絕請求。 NotFound = 404, // 0x00000194 (未找到) 服務器找不到請求的網頁。 MethodNotAllowed = 405, // 0x00000195 (方法禁用) 禁用請求中指定的方法。 NotAcceptable = 406, // 0x00000196 (不接受) 無法使用請求的內容特性響應請求的網頁。 ProxyAuthenticationRequired = 407, // 0x00000197 (需要代理授權) 此狀態代碼與 401(未授權)類似,但指定請求者應當授權使用代理。 RequestTimeout = 408, // 0x00000198 (請求超時) 服務器等候請求時發生超時。 Conflict = 409, // 0x00000199 (沖突) 服務器在完成請求時發生沖突。 服務器必須在響應中包含有關沖突的信息。 Gone = 410, // 0x0000019A (已刪除) 如果請求的資源已永久刪除,服務器就會返回此響應。 LengthRequired = 411, // 0x0000019B (需要有效長度) 服務器不接受不含有效內容長度標頭字段的請求。 PreconditionFailed = 412, // 0x0000019C (未滿足前提條件) 服務器未滿足請求者在請求中設置的其中一個前提條件。 RequestEntityTooLarge = 413, // 0x0000019D (請求實體過大) 服務器無法處理請求,因為請求實體過大,超出服務器的處理能力。 RequestUriTooLong = 414, // 0x0000019E (請求的 URI 過長) 請求的 URI(通常為網址)過長,服務器無法處理。 UnsupportedMediaType = 415, // 0x0000019F (不支持的媒體類型) 請求的格式不受請求頁面的支持。 RequestedRangeNotSatisfiable = 416, // 0x000001A0(請求范圍不符合要求) 如果頁面無法提供請求的范圍,則服務器會返回此狀態代碼。 ExpectationFailed = 417, // 0x000001A1 (未滿足期望值) 服務器未滿足”期望”請求標頭字段的要求。 MisdirectedRequest = 421, // 0x000001A5 (方向錯誤的請求) UnprocessableEntity = 422, // 0x000001A6 (不可獲得的實體) Locked = 423, // 0x000001A7 (被鎖定) FailedDependency = 424, // 0x000001A8 (依賴注入失敗) UpgradeRequired = 426, // 0x000001AA (需要升級) PreconditionRequired = 428, // 0x000001AC (必須滿足的先決條件) TooManyRequests = 429, // 0x000001AD (過多的請求) RequestHeaderFieldsTooLarge = 431, // 0x000001AF (請求頭字段太大) UnavailableForLegalReasons = 451, // 0x000001C3 (由於法律原因不可用) // 5xx(服務器錯誤)這些狀態代碼表示服務器在嘗試處理請求時發生內部錯誤。 這些錯誤可能是服務器本身的錯誤,而不是請求出錯。 InternalServerError = 500, // 0x000001F4 (服務器內部錯誤) 服務器遇到錯誤,無法完成請求。 NotImplemented = 501, // 0x000001F5 (尚未實施) 服務器不具備完成請求的功能。 例如,服務器無法識別請求方法時可能會返回此代碼。 BadGateway = 502, // 0x000001F6 (錯誤網關) 服務器作為網關或代理,從上游服務器收到無效響應。 ServiceUnavailable = 503, // 0x000001F7 (服務不可用) 服務器目前無法使用(由於超載或停機維護)。 通常,這只是暫時狀態。 GatewayTimeout = 504, // 0x000001F8 (網關超時) 服務器作為網關或代理,但是沒有及時從上游服務器收到請求。 HttpVersionNotSupported = 505, // 0x000001F9 (HTTP 版本不受支持) 服務器不支持請求中所用的 HTTP 協議版本。 VariantAlsoNegotiates = 506, // 0x000001FA InsufficientStorage = 507, // 0x000001FB (存儲不足) LoopDetected = 508, // 0x000001FC (循環檢測) NotExtended = 510, // 0x000001FE (無法擴展) NetworkAuthenticationRequired = 511, //0x000001FF(必須的網絡授權) } }
HTTP 協議一直在演變,新的狀態碼對於開發 REST 服務或者說是基於 HTTP 的服務非常有用。將來,還會不斷地有新的狀態碼被添加到協議中。