簡體   English   中英

Output 從 HttpClient HttpResponseMessage 到控制台的所有標頭

[英]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();
}

什么在起作用

到目前為止,該代碼的工作原理是它接收到來自服務器的響應。 並將標頭寫入控制台。

Output

 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()

標頭是不同的野獸

rfc2616 部分響應提到

在接收並解釋請求消息后,服務器以 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()

Header 類型和狀態行

據我所知僅區分

  • 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 )。 盡管如此返回一個看起來像這樣的狀態行

HTTP/1.1 200 OK

Header 妥協讓我頭疼

由於“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM