【问题标题】:How to use System.Net.HttpRequestHeader enum with an ASP.NET request?如何将 System.Net.HttpRequestHeader 枚举与 ASP.NET 请求一起使用?
【发布时间】:2014-10-23 19:45:06
【问题描述】:

在 WCF (System.Net.WebHeaderCollection) 中,可以使用 System.Net.HttpRequestHeader 枚举或标头字符串检索标头值:

WebOperationContext.Current.IncomingRequest.Headers[httpRequestHeaderEnum] 
// or
WebOperationContext.Current.IncomingRequest.Headers.Get(rawHeaderString)

但在 ASP.NET 中,标头位于仅接受标头字符串的 NameValueCollection 中:

 HttpContext.Current.Request.Headers[rawHeaderString]

为了在 ASP.NET 中使用 Enum,从 enum System.Net.HttpRequestHeader 到其标头字符串的映射在哪里?

【问题讨论】:

    标签: asp.net c#-4.0 http-headers


    【解决方案1】:

    写一个映射方法怎么样?以供参考: HttpRequestHeader enumeration

    你可以只做一个映射表,或者使用从Binary Worrier's post刷入的代码,你可以这样做:

    public static string TranslateToHttpHeaderName(HttpRequestHeader enumToTranslate)
    {
        const string httpHeaderNameSeparator = "-";
        string enumName = enumToTranslate.ToString();
        var stringBuilder = new StringBuilder();
    
        // skip first letter
        stringBuilder.Append(enumName[0]);
        for (int i = 1; i < enumName.Length; i++)
        {
            if (char.IsUpper(enumName[i])) stringBuilder.Append(httpHeaderNameSeparator);
            stringBuilder.Append(enumName[i]);
        }
        // Cover special case for 2 character enum name "Te" to "TE" header case.
        string headerName = stringBuilder.ToString();
        if (headerName.Length == 2) headerName = headerName.ToUpper();
        return headerName;
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用默认实现,使用 WebHeaderCollection

          private static readonly ConcurrentDictionary<HttpRequestHeader, string> ToStringKeyCache = new ConcurrentDictionary<HttpRequestHeader, string>();
          public static string ToStringKey(this HttpRequestHeader enumToEvaluate)
          {
              var str = ToStringKeyCache.GetOrAdd(enumToEvaluate, header =>
              {
                  var nm = new WebHeaderCollection();
                  nm.Set(header, "X");
                  return nm.AllKeys.Single();
              });
              return str;
          }
      

      【讨论】:

        【解决方案3】:

        除非我完全误解了你的问题:

        • 导入System.Net命名空间:using System.Net;

        例如网络表单:

        using System.Net
        
        protected void Page_Load(object sender, EventArgs e)
        {
            //Single - e.g. Connection 
            FooLabel.Text = Request.Headers[HttpRequestHeader.Connection.ToString()] + "<hr />";
        
            //Go through all
            foreach (var en in Enum.GetNames(typeof(HttpRequestHeader)))
            {
                FooLabel.Text += en + " : " + Request.Headers[en] + "<br />";
            }
        }
        

        第...

        【讨论】:

        • 问题是某些名称中有破折号(“-”)。例如,在您的示例中,“Accept”有效,但“Accept-Encoding”无效。
        猜你喜欢
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 2018-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多