【问题标题】:.NET - Content-Disposition Header Not Showing in WebAPI.NET - WebAPI 中未显示 Content-Disposition 标头
【发布时间】:2019-03-04 19:13:18
【问题描述】:

我正在尝试创建一个 WebAPI,它将向另一台服务器(企业 Oracle Agile PLM)发出 GET 请求,并返回一个文档。我正在使用.NET 4.5.1。我已经能够获得实际的文件数据,但很难获得它的原始文件名。我读过响应的 Content-Disposition 标头是查找此内容的最佳位置,因为它不包含在 URI 中。

这是我目前正在尝试但失败的内容。这是不完整的,因为我完全专注于尝试让标题显示:

public string GetDocsForDocNumber()
    {
        var docUrlString = "https://agprd.myDomain.com/Agile/link/Information%20Systems/1044698/files/ALL";
        var username = "user";
        var password = "pass";

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(docUrlString);
        try
        {
            string authKey = Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(username + ":" + password)); 
            request.Headers.Add("Authorization", "Basic " + authKey);

            //DEBUG - Printing out all request headers...
            WebHeaderCollection whCollection2 = request.Headers;
            for (int i = 0; i < whCollection2.Count; i++)
            {
                System.Diagnostics.Debug.WriteLine("\n REQUEST header key: " + whCollection2.GetKey(i) + "    value: " + whCollection2.Get(i));
            }

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            using (Stream rstream = response.GetResponseStream())
            {
                //DEBUG -- Printing out all response headers...
                WebHeaderCollection whCollection = res.Headers;
                for (int i = 0; i < whCollection.Count; i++)
                {
                    System.Diagnostics.Debug.WriteLine("header key: " + whCollection.GetKey(i) + "    value: " + whCollection.Get(i) + "\n");
                }
            }
            res.Close();
        }
        catch { }

        return "blah";
    }

这是在 VS 中打印的标题:

 REQUEST header key: Authorization    value: Basic eWFAKeJaSEHnef2jk9hasE=  (this is fudged FYI)

 RESPONSE header key: Transfer-Encoding    value: chunked

 RESPONSE header key: Cache-Control    value: private

 RESPONSE header key: Content-Type    value: application/octet-stream

 RESPONSE header key: Date    value: Fri, 28 Sep 2018 18:38:15 GMT

 RESPONSE header key: Set-Cookie    value: JSESSIONID=GTF8bn1XvKPw1mQ1HJaejfejjaE3fNb0pTG5T15VVbwGlQ!331878993!-1921346355; path=/; HttpOnly,NSC_WTWS-BHQSE-443=ffffffffaf1cef7b419874afe8455e445a4a422d69;Version=1;path=/;secure

 RESPONSE header key: X-Powered-By    value: Servlet/3.0 JSP/2.2

我使用 WebClient、HTTPClient 等尝试过类似的事情,但无法显示。如果我使用该 URI 并将其插入浏览器,则响应标头显示如下:

Browser response header pic

我不明白为什么当我从 WebAPI 发出请求时它不存在。我可以从 iOS 应用程序发出相同的请求,它工作正常。同样,我可以很好地获取实际的文档数据,但我无法获取文件名,因为该标题是 MIA。

有什么想法吗?我对此很陌生,所以我希望它是愚蠢而简单的。

谢谢

【问题讨论】:

  • 现在,由于我不知道甲骨文方面到底发生了什么,这很可能是错误的。但是我认为内容处置标头不存在的原因是因为 oracle 端有代码检查像user-agent 这样的请求标头,并且由于您没有这样的标头,所以它表明您不是浏览器。 (Content-disposition 标头提示浏览器如何处理接收到的数据,因此可能假设您不需要该标头)。因此,您可以通过在您的请求中添加 user-agent 标头(具有有效用户代理的值)来测试这个理论。
  • @pidizzle 大声笑你就是男人!那成功了!现在是星期五下午,所以我的啤酒已经开瓶了,但我要把剩下的献给你!干杯,谢谢!
  • 哈哈,这让我笑了。享受你的啤酒和这个周末!我发布了一个答案,所以你可以标记它。谢谢!

标签: c# .net asp.net-web-api httpwebrequest webrequest


【解决方案1】:

只有当存在有效的user-agent 时,oracle 服务器才会发送content-disposition(浏览器会自动发送用户代理标头)。 oracle 服务器可能会这样做,因为它假定您不想要 content-disposition 标头,除非您是浏览器(浏览器使用 content-disposition 标头知道如何处理返回的某些数据。即下载此文件,显示此图片等)。

所以自己添加 user-agent 标头以获取 content-disposition 标头。

【讨论】:

    猜你喜欢
    • 2011-02-02
    • 2012-02-27
    • 1970-01-01
    • 2018-10-30
    • 2011-09-27
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多