如何将 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 请求一起使用?的主要内容,如果未能解决你的问题,请参考以下文章