ContentDisposition类抛出不一致的异常

时间:2013-12-23 14:41:48

标签: 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)

我发现content-disposition字符串缺少尾随引号。当引号(“)放在.zip之后时,它可以工作。

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

更新

根据HTTP Content-Disposition specification

  

Content-Disposition response-header字段已被提议为   表示如果用户,原始服务器建议默认文件名   请求将内容保存到文件中。导出此用法   来自RFC 1806 [35]中Content-Disposition的定义。

    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类应该更灵活地接受文件名中不带引号的字符串。

1 个答案:

答案 0 :(得分:1)

相关的RFC是http://greenbytes.de/tech/webdav/rfc6266.html。不,从报价开始但忽略结束报价是不正确的。