HttpResponseMessage.Content.Headers ContentDisposition为null

Sea*_*man 18 c# dotnet-httpclient

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

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

码:

var responseMessage = await httpClient.GetAsync(uri, 
HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(continueOnCapturedContext: false);
Run Code Online (Sandbox Code Playgroud)

更新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 )
Run Code Online (Sandbox Code Playgroud)

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           = <the characters in token, followed by "*">
Run Code Online (Sandbox Code Playgroud)

哪里 ext-value = <ext-value, defined in [RFC5987], Section 3.2>

例子

工作案例

工作案例

失败的情况

失败的情况

更新2

用MS连接打开一张.

更新3

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

alf*_*gar 5

谢谢你 - 发现这绝对对我有帮助。为了其他人的利益,这是我的解决方法(显然这仍然是今天的事情???)

我处于某种受控环境中,因此以下代码假设:

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

这将重置响应的 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("\"",""));
  }
}
Run Code Online (Sandbox Code Playgroud)


Dar*_*ler 4

问题出在尾随 ; 在内容配置标头中

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

如果我添加分号,解析将失败。如果您查看 RFC6266 语法,您会发现分号仅应位于参数之前。