HttpResponseMessage.Content.Headers ContentDisposition为null

使用HttpClient下载文件时,我首先下载标题然后下载内容。 下载头文件时,我可以在HttpResponseMessage的Content属性上看到Headers集合,但是当通过Headers上的ContentDisposition访问它时,得到null 截图

为什么会这样? 提琴手显示标题很好……

码:

var responseMessage = await httpClient.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(continueOnCapturedContext: false); 

更新1

看起来这个类遵循RFC 2616中概述的Content-Disposition实现,并且无法处理Content-Disposition实现更新RFC 6266 。 RFC 2616将filename参数值定义为带引号的字符串 ,其中更新RFC 6266仅表明它应该是

RFC 2616语法

 content-disposition = "Content-Disposition" ":" disposition-type *( ";" disposition-parm ) disposition-type = "attachment" | disp-extension-token disposition-parm = filename-parm | disp-extension-parm filename-parm = "filename" "=" quoted-string disp-extension-token = token disp-extension-parm = token "=" ( token | quoted-string ) 

RFC 6266语法

 content-disposition = "Content-Disposition" ":" disposition-type *( ";" disposition-parm ) disposition-type = "inline" | "attachment" | disp-ext-type ; case-insensitive disp-ext-type = token disposition-parm = filename-parm | disp-ext-parm filename-parm = "filename" "=" value | "filename*" "=" ext-value disp-ext-parm = token "=" value | ext-token "=" ext-value ext-token =  

其中ext-value =

例子

工作案例

工作案例

失败的情况

失败的情况

更新2

用MS连接打开一张票 。

更新3

微软承认这是一个错误并将修复它。

问题在于尾随; 在content-disposition标头中

  [Fact] public void ParseContentDispositionHeader() { var value = ContentDispositionHeaderValue.Parse("attachment; filename=GeoIP2-City_20140107.tar.gz"); Assert.Equal("GeoIP2-City_20140107.tar.gz",value.FileName); } 

如果我添加分号,则解析将失败。 如果你看一下RFC6266语法,分号只应该在参数之前。

谢谢 – 找到这个肯定对我有帮助。 为了别人的利益,这是我的解决方法(显然这仍然是今天的事情???)

我处于一个有点受控制的环境中,因此以下代码假定:

  • 只有一个Content-Disposition标头
  • 标签的格式为: inline; "filename"; inline; "filename";

这将重置响应的ContentDisposition标头,以便后续代码无缝地工作:

  if (response.Content.Headers.ContentDisposition == null) { IEnumerable contentDisposition; if (response.Content.Headers.TryGetValues("Content-Disposition", out contentDisposition)) { response.Content.Headers.ContentDisposition = ContentDispositionHeaderValue.Parse(contentDisposition.ToArray()[0].TrimEnd(';').Replace("\"","")); } }