如何访问HttpClient响应中的Content-Disposition标头



我想从服务器下载一个文件,并用服务器建议的文件名保存(使用Content-Disposition头(。

我正在使用HttpClient下载该文件。

问题是,尽管.Contains("Content-Disposition")确认它存在,但我无法获得标头的值。并且没有错误,只是.ContentDisposition为空。

public async Task DownloadFile(Uri url, string destination) {
using (HttpClient client = new HttpClient()) {
client.DefaultRequestHeaders.Add("Authorization", APIKey);
HttpResponseMessage result = await client.GetAsync(url);
if (result.StatusCode == HttpStatusCode.NoContent) {
return;
}
if (result.StatusCode != HttpStatusCode.OK) {
throw new Exception("Request from " + url + " returned " + result.StatusCode);
}
if (!result.Content.Headers.Contains("Content-Disposition")) {
throw new Exception("Request from " + url + " contains no content disposition header.");
}
ContentDispositionHeaderValue cd = result.Content.Headers.ContentDisposition;
if (cd == null) {
throw new Exception("Content disposition header is null. headers = " + result.Content.Headers);
}
var filename = cd.FileName;
.
.
.
}
}

由此产生的异常是:Content disposition header is null. [...] Disposition: text/csv; filename=filename.csv [...]

为什么.ContentDisposition为空,即使.Contains("Content-Disposition")为真?

请注意,这是一项Windows服务,因此调试体验相当糟糕。

因此,正如@hereticmonkey所建议的,我使用result.Content.Headers.GetValues("Content-Disposition")获得了该值。这让我得到了字符串表示。当我尝试将它转换为ContentDispositionHeaderValue时,我得到了一个FormatException。我不知道为什么,因为根据相关的RFC:Content-Disposition: attachment; filename=1282661008.csv,标头应该正确格式化。这个例外本身不会给我太多解释。

我不得不自己用regex:解析它

if (!result.Content.Headers.Contains("Content-Disposition")) {
throw new Exception("Request from " + url + " contains no content disposition header.");
}
string[] cdarray = result.Content.Headers.GetValues("Content-Disposition").ToArray();
if (cdarray.Length != 1) {
throw new Exception("There is not exactly one Content-Disposition header. There is/are " + cdarray.Length);
}
GroupCollection groups = Regex.Match(cdarray[0], @"filename=""?([w.]*)""?").Groups;
if (groups.Count != 2) {
throw new Exception("Failed to parse the Content-Disposition header " + cdarray[0]);
}
var filename = groups[1].Value;

我觉得.NET中有一点我不明白:为什么在通过.ContentDisposition访问时解析失败时没有抛出异常?为什么创建ContentDispositionHeaderValue时抛出的异常没有更具描述性?

最新更新