检查HttpStatusCode是否代表成功或失败
我们假设我有以下variables:
System.Net.HttpStatusCode status = System.Net.HttpStatusCode.OK;
我怎样才能检查这是一个成功的状态代码或失败?
例如,我可以执行以下操作:
int code = (int)status; if(code >= 200 && code < 300) { //Success }
我也可以有一些白名单:
HttpStatusCode[] successStatus = new HttpStatusCode[] { HttpStatusCode.OK, HttpStatusCode.Created, HttpStatusCode.Accepted, HttpStatusCode.NonAuthoritativeInformation, HttpStatusCode.NoContent, HttpStatusCode.ResetContent, HttpStatusCode.PartialContent }; if(successStatus.Contains(status)) //LINQ { //Success }
这些替代方法都不能说服我,我希望有一个.NET类或方法可以为我做这个工作,比如:
bool isSuccess = HttpUtilities.IsSuccess(status);
如果你使用HttpClient
类,那么你会得到一个HttpResponseMessage
。
这个类有一个名为IsSuccessStatusCode
的有用的属性,将会为你做检查。
using (var client = new HttpClient()) { var response = await client.PostAsync(uri, content); if (response.IsSuccessStatusCode) { //... } }
如果你好奇,这个属性实现为:
public bool IsSuccessStatusCode { get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); } }
所以你可以重用这个algorithm,如果你不直接使用HttpClient
。
如果响应EnsureSuccessStatusCode
,您也可以使用EnsureSuccessStatusCode
引发exception。
HttpResponseMessage类有一个IsSuccessStatusCode属性,看它的源代码是这样的,所以usr已经build议200-299可能是你可以做的最好的。
public bool IsSuccessStatusCode { get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); } }
接受的答案让我有些困惑,因为它包含了神奇的数字(虽然它们是标准的)在第二部分。 第一部分不是普通的整数状态码,虽然它接近我的答案。
通过使用状态码实例化HttpResponseMessage并检查是否成功,可以获得完全相同的结果。 如果值小于零或大于999,它会抛出一个参数exception。
if (new HttpResponseMessage((HttpStatusCode)statusCode).IsSuccessStatusCode) { // ... }
这不完全简洁,但你可以把它作为一个扩展。
这取决于你正在调用的HTTP资源。 通常, 2xx
范围被定义为成功状态码的范围。 这显然是不是每个HTTP服务器都会遵守的惯例。
例如,在网站上提交表单通常会返回302redirect。
如果你想devise一个通用的方法,那么code >= 200 && code < 300
想法可能是你最好的select。
如果你正在调用你自己的服务器,那么你可能应该确保你在200
上进行标准化。
添加到@TomDoesCode答案如果您使用HttpWebResponse您可以添加此扩展方法:
public static bool IsSuccessStatusCode(this HttpWebResponse httpWebResponse) { return ((int)httpWebResponse.StatusCode >= 200) && ((int)httpWebResponse.StatusCode <= 299); }