C# HttpResponseMessage.Content.Headers ContentDisposition为空
使用HttpClient下载文件时,我首先下载头文件,然后下载内容。下载Header时,我可以在HttpResponseMessage的Content属性上看到headers集合,但通过headers上的ContentDisposition访问它时,会得到null 为什么会这样?Fiddler显示标题很好 代码: 更新1 此类似乎遵循中概述的内容处置实现,无法处理内容处置实现更新。RFC 2616将文件名参数值定义为带引号的字符串,其中更新RFC 6266仅说明它应该是值 RFC2616语法 RFC6266语法 其中ext值= 例子 工作案例 失败案例 更新2 使用MS connect打开了一个 更新3C# 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语法
微软已经承认了这一点,并将予以纠正 问题在于拖尾;在内容处置标头中
[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("\"",""));
}
}