提问人:Nick 提问时间:12/11/2019 最后编辑:Eliahu AaronNick 更新时间:12/12/2019 访问量:16277
C# - 如何从 http 请求中获取 HTTP 状态代码
C# - How to I get the HTTP Status Code from a http request
问:
我有以下代码,按预期工作(给定正确的 URL 等)作为 POST 请求。似乎我在阅读状态代码时遇到了问题(我收到了成功的 201,根据该数字我需要继续处理)。知道如何获取状态代码吗?
static async Task CreateConsentAsync(Uri HTTPaddress, ConsentHeaders cconsentHeaders, ConsentBody cconsent)
{
HttpClient client = new HttpClient();
try
{
client.BaseAddress = HTTPaddress;
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
client.DefaultRequestHeaders.Add("Connection", "keep-alive");
client.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
client.DefaultRequestHeaders.Add("otherHeader", myValue);
//etc. more headers added, as needed...
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, client.BaseAddress);
request.Content = new StringContent(JsonConvert.SerializeObject(cconsent, Formatting.Indented), System.Text.Encoding.UTF8, "application/json");
Console.WriteLine("\r\n" + "POST Request:\r\n" + client.DefaultRequestHeaders + "\r\nBody:\r\n" + JsonConvert.SerializeObject(cconsent, Formatting.Indented) + "\r\n");
await client.SendAsync(request).ContinueWith
(
responseTask =>
{
Console.WriteLine("Response: {0}", responseTask.Result + "\r\nBody:\r\n" + responseTask.Result.Content.ReadAsStringAsync().Result);
}
);
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine("Error in " + e.TargetSite + "\r\n" + e.Message);
Console.ReadLine();
}
}
答:
8赞
Athanasios Kataras
12/11/2019
#1
结果中有一个状态代码。
responseTask.Result.StatusCode
甚至更好
var response = await client.SendAsync(request);
var statusCode = response.StatusCode;
评论
0赞
JamesS
12/11/2019
如果成功,上述内容不会简单地返回响应吗?OP不是也要了代号吗?OK
0赞
Athanasios Kataras
12/11/2019
这将返回状态代码。Ok 是 200,如果是其他东西,它将是那个值。
2赞
JamesS
12/11/2019
是的,要返回 statuscode 值,您需要执行以下操作(int)response.StatusCode
0赞
Athanasios Kataras
12/11/2019
状态代码有多个枚举。learn.microsoft.com/en-us/dotnet/api/......你可以和它比较。
1赞
Athanasios Kataras
12/11/2019
continue with, 返回一个 not a response 值,因此需要将 var 更改为 。我建议您删除 continueWith,因为它根本不需要,然后继续我在上面与您共享的代码(没有 continueWith)。Task
HttpResponseMessage response = await ...
3赞
Dai
12/11/2019
#2
如果您已经在函数中,则有助于避免使用,因为您可以使用(更干净的)关键字。
ContinueWith
async
await
如果你的调用,你会得到一个对象,你可以从中获取状态代码:
await
SendAsync
HttpResponseMessage
此外,将对象包装在块中(除了 - 它应该是单例或更好的是,使用 )。
IDisposable
using()
HttpClient
static
IHttpClientFactory
不要用于特定于请求的标头,而应改用。
HttpClient.DefaultRequestHeaders
HttpRequestMessage.Headers
- 标头将自动为您发送。
Connection: Keep-alive
HttpClientHandler
- 您确定需要发送请求吗?如果您使用的是 HTTPS,那么几乎可以保证不会有任何代理缓存导致任何问题 - 并且也不使用 Windows Internet 缓存。
Cache-control: no-cache
HttpClient
- 不要使用,因为它会添加前导字节顺序标记。请改用私有实例。
Encoding.UTF8
UTF8Encoding
- 始终使用
.ConfigureAwait(false
) 替换为未在线程敏感上下文(如 WinForms 和 WPF)中运行的每个 on 代码。await
private static readonly HttpClient _httpClient = new HttpClient();
private static readonly UTF8Encoding _utf8 = new UTF8Encoding( encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true );
static async Task CreateConsentAsync( Uri uri, ConsentHeaders cconsentHeaders, ConsentBody cconsent )
{
using( HttpRequestMessage req = new HttpRequestMessage( HttpMethod.Post, uri ) )
{
req.Headers.Accept.Add( new MediaTypeWithQualityHeaderValue("*/*") );
req.Headers.Add("Cache-Control", "no-cache");
req.Headers.Add("otherHeader", myValue);
//etc. more headers added, as needed...
String jsonObject = JsonConvert.SerializeObject( cconsent, Formatting.Indented );
request.Content = new StringContent( jsonObject, _utf8, "application/json");
using( HttpResponseMessage response = await _httpClient.SendAsync( request ).ConfigureAwait(false) )
{
Int32 responseHttpStatusCode = (Int32)response.StatusCode;
Console.WriteLine( "Got response: HTTP status: {0} ({1})", response.StatusCode, responseHttpStatusCode );
}
}
}
评论
0赞
Nick
12/11/2019
非常感谢您的回复(双关语不是故意的:-) - 我如何“获取 HttpResponseMessage 对象”并读取数字(即 200 或 201 等) - 你能发布一个狙击手吗?同样重要的是:如何避免上述代码中的 ContinueWith?先谢谢你!
0赞
Nick
12/11/2019
非常感谢,事实上,这是对我的代码的一个很好的升级。但是,ConsoleWriteLine(“得到响应...返回一个字符串(在我的情况下为“已创建”,当然取决于其余 API - 但不是 HTTP 代码,我期待 int,即 200、201 等)
0赞
Dai
12/12/2019
@Nick 若要获取 / 状态代码,请强制转换属性。我已经更新了我的答案。Int32
int
StatusCode
1赞
Ankur Tripathi
12/11/2019
#3
只需检查响应的 StatusCode 属性即可:
static async void dotest(string url)
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
Console.WriteLine(response.StatusCode.ToString());
}
else
{
// problems handling here
Console.WriteLine(
"Error occurred, the status code is: {0}",
response.StatusCode
);
}
}
}
评论
0赞
Dai
12/11/2019
对象应包装在块中。此外,物品的寿命不应很短(所以不要立即处理)。response
using
HttpClient
HttpClient
0赞
JamesS
12/11/2019
#4
@AthanasiosKataras返回状态代码本身是正确的,但如果您还想返回状态代码值(即 200、404)。您可以执行以下操作:
var response = await client.SendAsync(request);
int statusCode = (int)response.StatusCode
以上将为您提供 int 200。
编辑:
难道您没有理由不能执行以下操作吗?
using (HttpResponseMessage response = await client.SendAsync(request))
{
// code
int code = (int)response.StatusCode;
}
评论
0赞
Nick
12/11/2019
这似乎很接近!!我该如何修改我的对账单?等待客户端。SendAsync(请求)。ContinueWith(responseTask => { Console.WriteLine(“响应:{0}”, responseTask.Result.StatusCode);当我使用它时,我得到一个字符串,即“Created”等,但是当我使用 responseTask.Result.StatusCode.GetTypeCode() 时;我收到 Int32 !!这个 200 或 201 数字在哪里......?
0赞
JamesS
12/11/2019
@Nick(int)responseTask.Result.StatusCode
0赞
Nick
12/11/2019
根据之前的评论:非常有用的提示。我确实 var 响应等待客户端。SendAsync(请求)。ContinueWith(responseTask => {Console.WriteLine(“响应:{0}”, responseTask.Result....然后 “int statusCode = (int)response.StatusCode;“,但我在第一个语句上收到一条错误消息(var response await...):必须初始化隐式类型的变量。请问我错过了什么?...
0赞
JamesS
12/11/2019
@Nick 如果你停止它,它有价值吗?response
0赞
Nick
12/11/2019
你的意思是在 var 响应 = 等待客户端...等。。?不幸的是,它在那里抛出错误,我迫切地想调试它。说“必须初始化隐式类型的变量”,但我不知道该初始化它。
评论
async
ContinueWith