Kug*_*gel 67 c# httpexception dotnet-httpclient
我可能在这里遗漏了一些明显的东西.
我正在使用Message字符串中包含的HttpClient哪个throws .HttpRequestExceptionStatusCode
我该如何访问StatusCode?
编辑:更多信息,我急着写这个问题.
我正在使用HttpClient我的WebApi项目中的另一个API.是的,我知道我为什么打电话EnsureSuccessStatusCode().我想在下游传播一些错误,例如404和403.
我想要的只是不断变换HttpRequestException为HttpResponseException使用自定义ExceptionFilterAttribute.
不幸的是,HttpRequestException除了消息之外,我没有携带任何额外的信息.我希望以StatusCode原始(int或enum)形式发现.
看起来我可以:
Lex*_* Li 28
状态代码作为字符串的一部分传递给HttpRequestException您,因此您无法仅从这些异常中恢复它.
设计System.Net.Http要求您访问HttpResponseMessage.StatusCode而不是等待异常.
http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage(v=vs.110).aspx
如果您现在正在关注Microsoft指南,请确保清楚地了解它要求您致电的原因HttpResponseMessage.EnsureSucessStatusCode.如果你不调用该函数,则不应该有异常.
Ste*_*eve 22
值得一提的是,这家伙做得很聪明:https: //social.msdn.microsoft.com/Forums/vstudio/en-US/dc9bc426-1654-4319-a7fb-383f00b68def/c-httpresponsemessage-throws-exception-httprequestexception -webexception最远程的名字吗?论坛= csharpgeneral
在我需要异常状态属性的情况下,我可以这样做:
catch (HttpRequestException requestException)
{
if (requestException.InnerException is WebException webException && webException.Status == WebExceptionStatus.NameResolutionFailure)
{
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
从 .NET 5.0 开始, HttpRequestException具有一个StatusCode属性,如果异常表示不成功的结果,则该属性将具有一个值,否则为 null。所以你可以使用如下:
try
{
// Your code
}
catch (HttpRequestException httpRequestException)
{
if ((int)httpRequestException.StatusCode == 401)
{
// Show unauthorized error message
}
else
{
// Other error message
}
}
Run Code Online (Sandbox Code Playgroud)
欲了解更多详情,请点击此处