[英]HttpResponseMessage missing headers while using HttpClient but fiddler finds it
[英]Output all headers from HttpClient HttpResponseMessage to console
我想將所有請求和響應標頭寫入控制台。
在控制台應用程序中(通過dotnet new console --framework net5.0
)我基本上有這段代碼
using System;
using System.Collections.Specialized;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
....
var client = new HttpClient();
var request = new HttpRequestMessage();
request.Method = HttpMethod.Get;
// add uri and header and so on ...
HttpResponseMessage response = await client.SendAsync(request);
PrintHeaders(response);
我的第一個PrintHeaders()
看起來像這樣
public static void PrintHeaders(HttpResponseMessage response)
{
// cast from HttpRequestHeaders
// and from HttpResponseHeaders
PrintHeaders((HttpHeaders)response.RequestMessage.Headers);
PrintHeaders((HttpHeaders)response.Headers);
}
和其他這樣的PrintHeaders()
public static void PrintHeaders(HttpHeaders headers)
{
Console.WriteLine( " Printing Headers " );
Console.WriteLine( " KEY VALUE" );
var headersEnumerator = headers.GetEnumerator();
while (headersEnumerator.MoveNext())
{
Console.WriteLine( " {0,-25} {1}"
, headersEnumerator.Current.Key
, String.Join(" ",headersEnumerator.Current.Value.GetEnumerator()) );
}
Console.WriteLine();
}
到目前為止,該代碼的工作原理是它接收到來自服務器的響應。 並將標頭寫入控制台。
Printing Headers
KEY VALUE
Authorization System.String[]
Printing Headers
KEY VALUE
Date System.String[]
Date System.SZGenericArrayEnumerator`1[System.String]
Connection System.String[]
正如您在上面看到的System.String[]
或System.SZGenericArrayEnumerator 1[System.String]
被寫入而不是實際值。
// System.String[] for
headersEnumerator.Current.Value.ToString()
// System.SZGenericArrayEnumerator`1[System.String] for
String.Join(" ",headersEnumerator.Current.Value.GetEnumerator())
不工作是將 header.value 作為純字符串,例如標題字段date
,例如Wed, 07 Sep 2022 10:45:04 GMT
相反,我只得到System.String[]
或類似的東西。
我可以對 output 所有標題鍵及其值作為控制台的純文本做些什么?
由於 header 鍵值是字符串的可枚舉,您可以執行以下操作:
foreach (var header in response.Headers){
foreach (var value in header.Value)
{
Console.WriteLine($"{header.Key} : {value}");
}
}
快速解決方法是更改:
Console.WriteLine( " {0,-25} {1}"
, headersEnumerator.Current.Key
, String.Join(" ",headersEnumerator.Current.Value.GetEnumerator()) );
至
Console.WriteLine( " {0,-25} {1}"
, headersEnumerator.Current.Key
, String.Join(" ",headersEnumerator.Current.Value) ); //removing GetEnumerator()
Cache-Control
, Connection
, Date
,...),Accept-Ranges
, Age
, Location
,...),還有在接收並解釋請求消息后,服務器以 HTTP 響應消息進行響應。
Response = Status-Line; Section 6.1 *(( general-header; Section 4.5 | response-header; Section 6.2 | entity-header ) CRLF); Section 7.1 CRLF [ message-body ]; Section 7.2
這清楚地表明,響應的第一行並不都是相同的。
在我看來, System.Net.Http
中的類配對與 rfc2616 並不完美匹配。 所以afaik沒有簡單的方法來編寫這樣的代碼
printStatusLine();
printGeneralHeader()
printResponseHeader()
printEntityHeader()
據我所知.net僅區分
httpResponseMessage.Headers
httpResponseMessage.Content.Headers
和到目前為止我得到了這個
public static string GetStatusLine(HttpResponseMessage message)
{
// HTTP-Version SP Status-Code SP Reason-Phrase CRLF
// string statusLine = ${"{0} {1} {2}", respMsg.Version)
string version = message.Version.ToString();
string code = ((int)message.StatusCode).ToString();
string phrase = message.ReasonPhrase;
string statusLine = $"{version} {code} {phrase} {Environment.NewLine}";
return statusLine;
}
上面的代碼返回這個1.1 200 OK
。 我假設這是根據狀態行規范( HTTP-Version SP Status-Code SP Reason-Phrase CRLF
)。 盡管如此vscode-restcode返回一個看起來像這樣的狀態行
HTTP/1.1 200 OK
由於“dotnet-headers”和“rfc2616-headers”似乎不匹配,最簡單的方法是使用這些成員
public static string GetGeneralHeaders(HttpResponseMessage message)
{
string headerLines = "";
foreach (var header in message.Headers)
{
foreach (var value in header.Value)
{
headerLines += ($"{header.Key} : {value} {Environment.NewLine}");
}
}
return headerLines;
}
和
public static string GetContentHeaders(HttpResponseMessage message)
{
string contentHeaderLines = "";
foreach (var header in message.Content.Headers)
{
foreach (var value in header.Value)
{
contentHeaderLines += $"{header.Key} : {value} {Environment.NewLine}";
}
}
return contentHeaderLines;
}
希望有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.