C# HttpResponseMessage.Content.Headers ContentDisposition为空

C# HttpResponseMessage.Content.Headers ContentDisposition为空,c#,dotnet-httpclient,C#,Dotnet Httpclient,使用HttpClient下载文件时,我首先下载头文件,然后下载内容。下载Header时,我可以在HttpResponseMessage的Content属性上看到headers集合,但通过headers上的ContentDisposition访问它时,会得到null 为什么会这样?Fiddler显示标题很好 代码: 更新1 此类似乎遵循中概述的内容处置实现,无法处理内容处置实现更新。RFC 2616将文件名参数值定义为带引号的字符串,其中更新RFC 6266仅说明它应该是值 RFC2616语法

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

为什么会这样?Fiddler显示标题很好

代码:

更新1 此类似乎遵循中概述的内容处置实现,无法处理内容处置实现更新。RFC 2616将文件名参数值定义为带引号的字符串,其中更新RFC 6266仅说明它应该是值

RFC2616语法 RFC6266语法 其中ext值=

例子 工作案例

失败案例

更新2 使用MS connect打开了一个

更新3
微软已经承认了这一点,并将予以纠正

问题在于拖尾;在内容处置标头中

        [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语法,分号应该只在参数前面。

谢谢你-找到它肯定对我有帮助。为了其他人的利益,这里是我的解决办法,因为很明显这在今天仍然是一件事

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

只有一个内容处置标头 标记的格式为:inline;文件名; 这将重置响应的ContentDisposition标头,以便后续代码无缝工作:

<!-- language: c# -->
if (response.Content.Headers.ContentDisposition == null)
{
  IEnumerable<string> contentDisposition;
  if (response.Content.Headers.TryGetValues("Content-Disposition", out contentDisposition))
  {
   response.Content.Headers.ContentDisposition = ContentDispositionHeaderValue.Parse(contentDisposition.ToArray()[0].TrimEnd(';').Replace("\"",""));
  }
}

这是正确的。也就是说,所有主要浏览器都会通过下载具有正确名称的文件来正确处理分号。@Sean我想知道是否可以创建一个messagehandler来删除任何后续分号。我不确定你是否能找到潜在的未处理字符串。我已经联系了导致问题的网站,但事实上是这样的。我还没有收到MS connect关于这个问题的回复。他们可以推回,或者,可以忽略分号来解析内容处置头。此外,当文件引用RFC2616规范时,它们不应该返回名称id双引号以向后兼容。更新3中的错误链接不再指向该错误。请OP或其他人修复它好吗?@P5Coder Microsoft Connect已退役,并被Microsoft Collaborate取代,无需重新定向链接。如果您仍然需要该链接,建议ping Microsoft支持部门提供帮助。
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           = <the characters in token, followed by "*">
        [Fact]
        public void ParseContentDispositionHeader()
        {
            var value = ContentDispositionHeaderValue.Parse("attachment; filename=GeoIP2-City_20140107.tar.gz");
            Assert.Equal("GeoIP2-City_20140107.tar.gz",value.FileName);
        }
<!-- language: c# -->
if (response.Content.Headers.ContentDisposition == null)
{
  IEnumerable<string> contentDisposition;
  if (response.Content.Headers.TryGetValues("Content-Disposition", out contentDisposition))
  {
   response.Content.Headers.ContentDisposition = ContentDispositionHeaderValue.Parse(contentDisposition.ToArray()[0].TrimEnd(';').Replace("\"",""));
  }
}