无法在 C# 中使用 httpclient 获取标头“Content-Disposition”

Posted

技术标签:

【中文标题】无法在 C# 中使用 httpclient 获取标头“Content-Disposition”【英文标题】:Unable to get header "Content-Disposition" with httpclient in C# 【发布时间】:2016-04-20 05:31:16 【问题描述】:

场景: 首先,请考虑我使用的是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:附件;文件名=814Entes_PG_20160114.txt

从代码中我可以调试它,我发现标头在“invalidHeaders”中,但我无法达到该值:

问题:

我如何设置它并毫无疑问地从客户那里获得?

更新:

这些是我获取标题的尝试: 原文:

                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();
                

我尝试了一些 SO 调查的第二个:

        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();
                

            

【问题讨论】:

您能否展示发出请求的代码以及您如何尝试“获取”标头?鉴于 Content-Length 和 Content-Type 也在“无效标头”集合中,我怀疑您的请求代码。 当然,我不认为那是,让我更新我的问题。完成@CodeCaster 感谢您的建议! 另外,如果你想获取内容的标题......不应该来自response.Content.Headers吗? @terbubbs 你是对的,我忘记了.content。请做出您的评论答案,以便将其标记为答案。非常感谢! @LeandroTupone 没问题!我正在处理一个传回 pdf 文件的 HttpClient,所以我查看了它并认为可能是它 【参考方案1】:

如果你试图获取内容的标题,它应该来自response.Content.Headers

【讨论】:

如果 content-disposition 标头不存在。我应该怎么做才能让它存在? @gumuruh 为请求提供服务的服务器需要设置标头以使其存在于响应中 @HaukurHaf 访问 response.Content.Headers 会导致整个内容被读入内存吗?我试图避免这种情况。谢谢。

以上是关于无法在 C# 中使用 httpclient 获取标头“Content-Disposition”的主要内容,如果未能解决你的问题,请参考以下文章

在 c# (.net core) 中使用 httpclient 时无法建立 SSL 连接,但在 Postman 和 Browser 中有效

C#使用HttpClient获取Location

c#:如何使用 httpclient 发布异步请求并获取流?

C# 使用 HttpClient 从 JSON 响应中获取特定对象

C# 中HttpClient无法发送json对象

C# 中HttpClient无法发送json对象