检查 HttpStatusCode 是否表示成功或失败
Checking if HttpStatusCode represents success or failure
假设我有以下变量:
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
}
None 这些替代方案让我信服,我希望有一个 .NET class 或方法可以为我完成这项工作,例如:
bool isSuccess = HttpUtilities.IsSuccess(status);
这取决于您调用的 HTTP 资源。通常,2xx
范围被定义为成功状态代码的范围。这显然不是每个 HTTP 服务器都会遵守的约定。
例如,在网站上提交表单通常会 return 302 重定向。
如果您想设计一个通用方法,那么 code >= 200 && code < 300
想法可能是您的最佳选择。
如果您调用自己的 服务器,那么您可能应该确保在 200
.
上进行标准化
HttpResponseMessage class 有一个 IsSuccessStatusCode 属性,查看源代码是这样的,因为 usr 已经建议 200-299 可能是你能做的最好的。
public bool IsSuccessStatusCode
{
get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}
如果您使用的是 HttpClient
class,那么您将获得 HttpResponseMessage
回报。
这个 class 有一个很有用的 属性 叫做 IsSuccessStatusCode
可以帮你检查。
using (var client = new HttpClient())
{
var response = await client.PostAsync(uri, content);
if (response.IsSuccessStatusCode)
{
//...
}
}
如果你好奇,这个 属性 是 implemented 为:
public bool IsSuccessStatusCode
{
get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}
因此,如果您 不是 直接使用 HttpClient
,则可以重复使用此算法。
如果响应不成功,您也可以使用 EnsureSuccessStatusCode
抛出异常。
添加到@TomDoesCode 答案如果您使用的是 HttpWebResponse
您可以添加此扩展方法:
public static bool IsSuccessStatusCode(this HttpWebResponse httpWebResponse)
{
return ((int)httpWebResponse.StatusCode >= 200) && ((int)httpWebResponse.StatusCode <= 299);
}
接受的答案让我有点困扰,因为它在第二部分包含幻数(尽管它们是标准的)。第一部分不是普通整数状态代码的通用部分,尽管它接近我的答案。
您可以通过使用您的状态代码实例化 HttpResponseMessage 并检查是否成功来获得完全相同的结果。如果值小于零或大于 999,它确实会抛出参数异常。
if (new HttpResponseMessage((HttpStatusCode)statusCode).IsSuccessStatusCode)
{
// ...
}
这不是很简洁,但您可以将其扩展。
这是对先前答案的扩展,它避免了为每次调用创建新对象并随后进行垃圾回收。
public static class StatusCodeExtensions
{
private static readonly ConcurrentDictionary<HttpStatusCode, bool> IsSuccessStatusCode = new ConcurrentDictionary<HttpStatusCode, bool>();
public static bool IsSuccess(this HttpStatusCode statusCode) => IsSuccessStatusCode.GetOrAdd(statusCode, c => new HttpResponseMessage(c).IsSuccessStatusCode);
}
我偏爱扩展方法的可发现性。
public static class HttpStatusCodeExtensions
{
public static bool IsSuccessStatusCode(this HttpStatusCode statusCode)
{
var asInt = (int)statusCode;
return asInt >= 200 && asInt <= 299;
}
}
只要您的命名空间在范围内,用法就是 statusCode.IsSuccessStatusCode()
。
假设我有以下变量:
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
}
None 这些替代方案让我信服,我希望有一个 .NET class 或方法可以为我完成这项工作,例如:
bool isSuccess = HttpUtilities.IsSuccess(status);
这取决于您调用的 HTTP 资源。通常,2xx
范围被定义为成功状态代码的范围。这显然不是每个 HTTP 服务器都会遵守的约定。
例如,在网站上提交表单通常会 return 302 重定向。
如果您想设计一个通用方法,那么 code >= 200 && code < 300
想法可能是您的最佳选择。
如果您调用自己的 服务器,那么您可能应该确保在 200
.
HttpResponseMessage class 有一个 IsSuccessStatusCode 属性,查看源代码是这样的,因为 usr 已经建议 200-299 可能是你能做的最好的。
public bool IsSuccessStatusCode
{
get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}
如果您使用的是 HttpClient
class,那么您将获得 HttpResponseMessage
回报。
这个 class 有一个很有用的 属性 叫做 IsSuccessStatusCode
可以帮你检查。
using (var client = new HttpClient())
{
var response = await client.PostAsync(uri, content);
if (response.IsSuccessStatusCode)
{
//...
}
}
如果你好奇,这个 属性 是 implemented 为:
public bool IsSuccessStatusCode
{
get { return ((int)statusCode >= 200) && ((int)statusCode <= 299); }
}
因此,如果您 不是 直接使用 HttpClient
,则可以重复使用此算法。
如果响应不成功,您也可以使用 EnsureSuccessStatusCode
抛出异常。
添加到@TomDoesCode 答案如果您使用的是 HttpWebResponse 您可以添加此扩展方法:
public static bool IsSuccessStatusCode(this HttpWebResponse httpWebResponse)
{
return ((int)httpWebResponse.StatusCode >= 200) && ((int)httpWebResponse.StatusCode <= 299);
}
接受的答案让我有点困扰,因为它在第二部分包含幻数(尽管它们是标准的)。第一部分不是普通整数状态代码的通用部分,尽管它接近我的答案。
您可以通过使用您的状态代码实例化 HttpResponseMessage 并检查是否成功来获得完全相同的结果。如果值小于零或大于 999,它确实会抛出参数异常。
if (new HttpResponseMessage((HttpStatusCode)statusCode).IsSuccessStatusCode)
{
// ...
}
这不是很简洁,但您可以将其扩展。
这是对先前答案的扩展,它避免了为每次调用创建新对象并随后进行垃圾回收。
public static class StatusCodeExtensions
{
private static readonly ConcurrentDictionary<HttpStatusCode, bool> IsSuccessStatusCode = new ConcurrentDictionary<HttpStatusCode, bool>();
public static bool IsSuccess(this HttpStatusCode statusCode) => IsSuccessStatusCode.GetOrAdd(statusCode, c => new HttpResponseMessage(c).IsSuccessStatusCode);
}
我偏爱扩展方法的可发现性。
public static class HttpStatusCodeExtensions
{
public static bool IsSuccessStatusCode(this HttpStatusCode statusCode)
{
var asInt = (int)statusCode;
return asInt >= 200 && asInt <= 299;
}
}
只要您的命名空间在范围内,用法就是 statusCode.IsSuccessStatusCode()
。