使用C#中的httpclient无法获取“Content-Disposition”头信息

8

情景:
首先,请注意我正在使用 HttpClient 类,而不是 WebRequest。我知道这里有很多相关的问题,但所有答案都是针对 WebRequest 的。

我制作了一个 Web Api 应用程序,以以下方式设置标题,以下载一个 .txt 文件:

resp.Content = new StringContent(result, System.Text.Encoding.UTF8, "text/plain");
resp.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
{
    FileName = _datacontext.GetAppConfig("814FileNameHeader") + DateTime.Now.ToString("yyyyMMdd") + ".txt"
};
resp.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");  

当我从另一个应用程序创建一个HttpClient来连接到这个方法后,一切都正常,返回200和文件内容。但我无法获取标题以便读取文件名。

尝试过的方法:

使用REST客户端可以读取以下标题属性:

Content-Disposition: attachment; filename=814Entes_PG_20160114.txt

从代码中调试发现标题在"invalidHeaders"中,但无法访问该值:

enter image description here

问题:

如何设置并从客户端无疑地获得它?

更新:

这是我尝试获取标题的方法:

原始标题:

                using (var httpClient = new HttpClient())
            {
                httpClient.BaseAddress = new Uri(uri);
                string authentication = string.Concat(authenticationArgs[0], ":", authenticationArgs[1]);
                httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Basic " + Base64Encode(authentication));
                httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, "Report/" + type);
                req.Content = new StringContent("");
                HttpResponseMessage response = await httpClient.SendAsync(req);
                Console.WriteLine(response.StatusCode);
                if (response.IsSuccessStatusCode)
                {
                    string stream = response.Content.ReadAsStringAsync().Result;
                    Console.Write("Respuesta servicio: " + stream);
                    Console.WriteLine(stream);

                  string cp =  response.Headers.GetValues("Content-Disposition").ToString();
                }

我尝试了第二种方法,并进行了一些Stack Overflow的调查:
        using (var httpClient = new HttpClient())
        {
            httpClient.BaseAddress = new Uri(uri);
            string authentication = string.Concat(authenticationArgs[0], ":", authenticationArgs[1]);
            httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Basic " + Base64Encode(authentication));
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, "Report/" + type);
            req.Content = new StringContent("");
            HttpResponseMessage response = await httpClient.SendAsync(req);
            Console.WriteLine(response.StatusCode);
            if (response.IsSuccessStatusCode)
            {
                string stream = response.Content.ReadAsStringAsync().Result;
                Console.Write("Respuesta servicio: " + stream);
                Console.WriteLine(stream);
                string cp = "";
                HttpHeaders headers = response.Headers;
                IEnumerable<string> values;
                if (headers.TryGetValues("Content-Disposition", out values))
                {
                    cp = values.ToString();
                }

            }

2
请问您能否展示一下发送请求的代码以及如何尝试“获取”标头?考虑到Content-Length和Content-Type也在“无效标头”集合中,我怀疑是您的请求代码有问题。 - CodeCaster
当然,我没有考虑到那一点,让我更新我的问题。@CodeCaster,谢谢你的建议! - Leandro Bardelli
只是好奇,但如果MediaTypeHeaderValue是application/octet-stream,你不应该使用ReadAsStreamAsync().Result来读取响应吗? - terbubbs
1
另外,如果你正在尝试获取内容的头信息.. 那不应该是从 response.Content.Headers 中获取吗? - terbubbs
1
@terbubbs 你说得对,我忘记了 .content。请把你的评论变成答案以便我标记它为答案。非常感谢! - Leandro Bardelli
1
@LeandroTupone 没问题!我正在处理一个传回 PDF 文件的 HttpClient,所以我回顾了一下,认为可能是这个原因。 - terbubbs
2个回答

25

如果您想获取内容的头信息,则应从 response.Content.Headers 中获取。


如果 content-disposition 头不存在,我该怎么做才能让它存在? - gumuruh
1
@gumuruh,正在处理请求的服务器需要设置头信息,以便在响应中存在。 - HaukurHaf
@HaukurHaf 访问 response.Content.Headers 会导致整个内容被读入内存吗?我想避免这种情况。谢谢。 - fire_water

2
根据@terbubbs所说,您需要使用response.Content.Headers。但是第一段代码还需要进行以下修改:
string cp = response.Result.Content.Headers.GetValues("Content-Disposition").ToList()[0];

而对于第二个问题:
cp = values.FirstOrDefault().ToString();

否则结果为 System.String[]

这是非常老的代码,你应该使用像restsharp这样的另一个代码片段。 - Leandro Bardelli
不管怎么样,我会为你点赞,感谢你的回答。 - Leandro Bardelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接