ContentDisposition 类抛出不一致的异常

Posted

技术标签:

【中文标题】ContentDisposition 类抛出不一致的异常【英文标题】:ContentDisposition class throwing inconsistent exception 【发布时间】:2014-01-11 19:14:52 【问题描述】:

我正在使用 WebClient 来发现下载文件名,使用 content-disposition。

调用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:

Content-Disposition 响应头字段已被提议作为 意味着源服务器建议一个默认文件名,如果用户 请求将内容保存到文件中。这种用法是派生的 来自 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】:

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

【讨论】:

我同意,但是为什么 IIS 服务器会这样返回呢?

以上是关于ContentDisposition 类抛出不一致的异常的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Aspectj 捕获和抑制 Java 类抛出的异常

TailwindCSS 为暗模式类抛出错误

导航库充气机为数据类抛出 ClassNotFoundException

Ninject - 如何在构造过程中识别哪个类抛出异常

用户类抛出异常:org.apache.spark.sql.AnalysisException:无法推断 Parquet 的架构。必须手动指定

Apache Spark 2.4.0、AWS EMR、Spark Redshift 和 User 类抛出异常:java.lang.AbstractMethodError