c# - ContentDisposition 类抛出不一致的异常

标签 c# parsing http webclient content-disposition

我正在使用 WebClient 使用内容配置来发现下载文件名。

调用 client.ResponseHeaders["content-disposition"] 返回以下字符串:

attachment; filename="2013122100000030141b0feedd40488fa2b0691fa6ae2a.zip

然后,

fileName = new ContentDisposition(responseHeader).FileName;

抛出异常“指定的内容配置无效。”:

System.FormatException: The specified content disposition is invalid. ---> System.FormatException: The mail header is malformed.
   at System.Net.Mime.MailBnfHelper.ReadQuotedString(String data, Int32& offset, StringBuilder builder, Boolean doesntRequireQuotes, Boolean permitUnicodeInDisplayName)
   at System.Net.Mime.ContentDisposition.ParseValue()
   --- End of inner exception stack trace ---
   at System.Net.Mime.ContentDisposition.ParseValue()
   at System.Net.Mime.ContentDisposition..ctor(String disposition)

我发现内容配置字符串缺少尾随引号。当引号 (") 放在 .zip 之后时,它起作用。

服务器似乎是 IIS 6。它是 ContentDisposition 类中的错误吗?我不想担心通过删除不需要的引号来处理该字符串,但在这种情况下我无法解释“谁”是错误的,服务器或类。有什么想法吗?

更新:

根据HTTP Content-Disposition specification :

The Content-Disposition response-header field has been proposed as a means for the origin server to suggest a default filename if the user requests that the content is saved to a file. This usage is derived from the definition of Content-Disposition in RFC 1806 [35].

    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 ) An example is

    Content-Disposition: attachment; filename="fname.ext"

从引用的 RFC 来看,引号不是约束,所以我认为 ContentDisposition 类应该更灵活地接受文件名中不带引号的字符串。

最佳答案

相关的 RFC 是 http://greenbytes.de/tech/webdav/rfc6266.html .不,以引号开头但省略结尾引号是不正确的。

关于c# - ContentDisposition 类抛出不一致的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20745742/

相关文章:

c# - 从返回类型为 Task 的方法返回值

android - 数据狗朗姆酒 : Is it possible to include HTTP request body in resource logging?

http - DNS 查找和 HTTP 代理

javascript - 如何获取 Node.js 可写流的大小(HTTP 服务器响应)

c# - 如何按照多线程 Web 应用程序中的查询结果显示顺序?

c# - 在 C#.NET 的帮助下,将数据从我的计算机连接并插入到服务器的 MySQL DB 表

c# - ASP.NET MVC5 不会创建 MySQL 数据库,除非在初始化程序处中断

objective-c - 如何通过在 Objective-C 中删除路径中的 2 个文件夹来解析 NSString

javascript - 客户端页面调用/抓取?

java.lang.NullPointerException xml解析