如何将 System.Net.HttpRequestHeader 枚举与 ASP.NET 请求一起使用?

Posted

技术标签:

【中文标题】如何将 System.Net.HttpRequestHeader 枚举与 ASP.NET 请求一起使用?【英文标题】:How to use System.Net.HttpRequestHeader enum with an ASP.NET request? 【发布时间】: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 到其标头字符串的映射在哪里?

【问题讨论】:

【参考方案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”无效。

以上是关于如何将 System.Net.HttpRequestHeader 枚举与 ASP.NET 请求一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何将Ios文件上传到

Qt如何将文字变成图片?

如何将Bitmap保存为本地图片文件?

在MATLAB中如何将图导出

ASP如何将SQLSERVER数据导出到DBF(VF)

如何将CSV格式转换成JSON格式