检查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); }