【问题标题】:Set Accepts in HTTP Download Request Header在 HTTP 下载请求标头中设置接受
【发布时间】:2012-04-13 05:31:45
【问题描述】:

我有一个返回发票的 WCF Web Api 端点:http://localhost/api/invoice/23

它返回的格式是请求中接受头的格式。如果 Javascript 需要 JSON 或 XML,那么它只需在接受标头中设置它。这就是 WCF Web Api 的工作方式。我在发票中添加了一个 PDF 格式化程序,以便在请求应用程序/pdf 时,它会得到一个带有适当 MIME 类型的渲染 pdf 文件流。这很好用,我可以在 fiddler 中测试它。

我需要用户单击浏览器中的某些内容来开始 PDF 下载并弹出打开/保存对话框。我不知道如何执行此操作并设置请求的接受标头。 javascript 中的静态链接或 window.location 不起作用,因为它不允许我设置标题。 AJAX 请求不起作用,因为虽然我可以设置标头,但它需要返回文本,并且不会在浏览器中显示为下载。

我不确定我该怎么做。任何建议将不胜感激。

【问题讨论】:

    标签: wcf wcf-web-api


    【解决方案1】:

    您可以在 JavaScript 中动态创建一个表单并要求它在新选项卡中开始。那应该给你你想要的。

    function SubmitRequest() 
    {
            var myForm = document.createElement("form");
            myForm.method = "post";
            myForm.action = "url here"
            var myInput = document.createElement("input");
            myInput.setAttribute("name", "json");
            myForm.setAttribute("target", "_blank");
            myInput.setAttribute("value", "Your value here");
            myForm.appendChild(myInput);
            document.body.appendChild(myForm);
            myForm.submit();
            document.body.removeChild(myForm);
        }
    

    【讨论】:

    • 他为什么要做POST?
    • 这几乎正是我所追求的,只是将方法更改为 GET 并将接受标头添加到表单的接受属性中。然而事实证明,当在表单中指定时,没有浏览器支持接受标头。哦该死
    【解决方案2】:

    最简单的方法是在您的页面中添加一个带有指向http://localhost/api/invoice/23.pdf 的链接的 A 标记,然后使用格式化程序上的 AddUriPathExtensionMapping 让它从 URI 上的路径扩展名自动生成接受标头。

    【讨论】:

    • 我无法让它与 .extension 一起使用。它一直说找不到端点,因此不会访问任何格式化程序。我在示例代码中发现了一个消息处理程序,它允许我将 invoice/23/pdf 转换为适当的接受标头,然后允许我的 pdf 格式化程序完成它的工作,并使发票服务本身完全不知道发生的事情。所以谢谢你让我走上正轨。
    • 有趣,我得试一试。它应该与 .extension 一起使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2011-06-24
    • 2014-06-02
    • 1970-01-01
    • 2012-10-03
    • 2016-10-15
    • 1970-01-01
    相关资源
    最近更新 更多