实际应用场景是将http请求的Request.Headers(类型就是NameValueCollection)记录到日志。
string.Join(",",Request.Headers.AllKeys.SelectMany(Request.Headers.GetValues, (k, v) => new { key = k, value = v }));
SelectMany可行,稍作修改的代码:
var headersString = string.Join( Environment.NewLine, Request.Headers.AllKeys.SelectMany( Request.Headers.GetValues, (k, v) => k + ": " + v));
哈哈.tojson();我都是这么干的.
Headers = JsonConvert.SerializeObject(Request.Headers)
这个序列化出来只有Key:
["Cache-Control","Connection","Content-Length","Accept","Accept-Encoding","Accept-Language","Cookie","Host","If-Modified-Since","User-Agent","Upgrade-Insecure-Requests","X-Original-URL"]
先转字典 再json
JsonConvert.SerializeObject(Request.Headers.AllKeys.ToDictionary(k=>k,v=>Request.Headers[v]))
我觉得还是用string.Join直接拼比较实用,至少不需要依赖第三方包。
string headersString = string.Join("\r\n", context.Request.Headers.Select(s => s.Key + ":" + s.Value.ToString()));
哈哈,楼上的思路,不用第三方包。
报错:
'NameValueCollection' does not contain a definition for 'Select' and no extension method 'Select' accepting a first argument of type 'NameValueCollection' could be found
@dudu: 这段代码在asp.net core中是可以运行的。
刚看了一下Core版本的Headers属性的类型是IHeaderDictionary,继承了泛型的IEnumerable;
而传统的ASP.NET中Headers的类型为NameValueCollection,只继承了非泛型的IEnumerable。
Select这个扩展方法是对泛型的IEnumerable借口的扩展,所以这里不能使用…
@行乎当行: 嗯,asp.net core中可以的。