【问题标题】:How to dump ASP.NET Request headers to string如何将 ASP.NET 请求标头转储到字符串
【发布时间】:2010-04-13 09:58:20
【问题描述】:

我想通过电子邮件向自己发送一份 GET 请求标头的快速转储,以便进行调试。我以前可以在经典 ASP 中简单地使用 Request 对象来执行此操作,但 Request.ToString() 不起作用。以下代码返回一个空字符串:

using (StreamReader reader = new StreamReader(Request.InputStream))
{
    string requestHeaders = reader.ReadToEnd();
    // ...
    // send requestHeaders here
}

【问题讨论】:

    标签: c# asp.net asp.net-mvc


    【解决方案1】:

    查看 Request 对象中的 Headers 属性。

    C#

    string headers = Request.Headers.ToString();
    

    或者,如果您希望以其他方式对其进行格式化:

    string headers = String.Empty;
    foreach (var key in Request.Headers.AllKeys)
      headers += key + "=" + Request.Headers[key] + Environment.NewLine;
    

    VB.NET:

    Dim headers = Request.Headers.ToString()
    

    或者:

    Dim headers As String = String.Empty
    For Each key In Request.Headers.AllKeys
      headers &= key & "=" & Request.Headers(key) & Environment.NewLine
    Next
    

    【讨论】:

    • +1 只需添加一行以通过电子邮件发送,我认为这是完整的答案(问题被标记为 C#,所以我认为 VB.Net 版本不是必需的)。
    • First KeyValuePair sn-p 导致运行时转换错误,所以我使用 foreach (Request.Headers 中的字符串键) header += key + " = " + Request.Headers[key] + Environment.NewLine ;
    • 您可以使用 string.Join 方法连接所有数据: string.Join(Environment.NewLine, Request.Headers.AllKeys.Select(key=>string.Format("Key:{0}, Value :{1}", key, Request.Headers[key])));这种方法比你的更快,因为 string.Join 更有效地连接多个对象
    • 对于 AspNetCore,由于 Kestrel 封装了标头,并且键以 'Header' 为前缀,因此您需要迭代标头字典,然后转储键值对,可能会删除单词'标题'。
    • 这也适用于 Form 对象的请求,仅供参考
    【解决方案2】:

    您可以在页面上打开跟踪以轻松查看标题、cookie、表单变量、查询字符串等:

    aspx 开头的顶行:

    <%@ Page Language="C#" Trace="true" 
    

    【讨论】:

    • Trace not available for this configuration: &lt;deployment retail=true /&gt; 通常用于 machine.config 中的生产 Web 服务器,您可以从此处阅读更多关于配置值继承的信息 msdn.microsoft.com/en-us/library/ms178685.aspx
    【解决方案3】:

    对于那些(像我一样)在IHeaderDictionary 实现中缺少AllKeys 属性的人来说,这是我能够序列化字符串中的所有标头(在控制器操作内)的方式。

    using System;
    using System.Text;
    
    // ...
    
    var builder = new StringBuilder(Environment.NewLine);
    foreach (var header in Request.Headers)
    {
        builder.AppendLine($"{header.Key}: {header.Value}");
    }
    var headersDump = builder.ToString();
    

    我正在使用 ASP.NET Core 3.1。

    【讨论】:

      【解决方案4】:

      你可以使用,

      string headers = Request.Headers.ToString(); 
      

      但它会返回 URL 编码的字符串,因此使用下面的代码对其进行解码,

      String headers = HttpUtility.UrlDecode(Request.Headers.ToString()) 
      

      【讨论】:

      • 对我来说,它只输出Microsoft.AspNetCore.HttpSys.Internal.RequestHeaders 而不是实际的标题。
      【解决方案5】:

      asp.net core 吐出Microsoft.AspNetCore.HttpSys.Internal.RequestHeaders 对于Request.Headers.ToString(),因此在这种情况下的解决方案是:

      IEnumerable<string> keyValues = context.Request.Headers.Keys.Select(key => key + ": " + string.Join(",", context.Request.Headers[key]));
      string requestHeaders = string.Join(System.Environment.NewLine, keyValues);
      

      【讨论】:

        【解决方案6】:

        您可以使用此 (VB.Net) 一次性将所有标题作为 string() 获取

        Request.Headers.ToString.Split(New String() {vbCrLf}, StringSplitOptions.RemoveEmptyEntries)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-19
          • 1970-01-01
          • 2012-05-02
          • 2012-06-03
          • 2019-11-26
          • 2011-10-14
          • 1970-01-01
          相关资源
          最近更新 更多