【问题标题】:Attaching files to WCF REST service responses将文件附加到 WCF REST 服务响应
【发布时间】:2010-06-07 18:30:39
【问题描述】:

我有一个看起来像这样的资源:

/users/{id}/summary?format={format}

format 是“xml”或“json”时,我会返回一个由 WCF 自动编码的用户摘要对象 - 到目前为止还不错。但是当format 等于“pdf”时,我希望我的响应包含一个简单的 HTTP 响应正文和一个 PDF 文件附件。

这是怎么做到的?对WebOperationContext.Current.OutgoingResponse 进行黑客攻击似乎不起作用,即使这样做也不是正确的事情。在 CDATA 部分或响应 isn't safe 中包含文件的位。我应该创建一个Message 的子类,然后提供一个自定义的IDispatchMessageFormatter 来响应它吗?我沿着这条路走了一小段路,但最终发现文档不透明。

什么是正确的?

【问题讨论】:

    标签: wcf rest


    【解决方案1】:

    事实证明,我需要的是 WCF“原始”模式,如 here 所述。从广义上讲,我想这样做:

    [OperationContract, WebGet(UriTemplate = "/users/{id}/summary?format={format}"]
    public Stream GetUserSummary(string id, string format)
    {
        if(format == "pdf")
        {
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/pdf";
            return new MemoryStream(CreatePdfSummaryFileForUser(id));
        }
        else
        {
            // XML or JSON serialization.  I can't figure out a way to not do this explicitly, but my use case involved custom formatters anyway so I don't care.
        }
    }
    

    【讨论】:

    • 您好,只是想知道您是否可以分享您如何设置客户端绑定以使其工作...
    • 没有,它是 REST,您点击一个 URL 并返回一个 HTTP 响应。我误会你了吗?
    【解决方案2】:

    理论上,您可以使用多部分内容 MIME 类型来做到这一点(请参阅http://www.faqs.org/rfcs/rfc2387.html)。但是,在 XML/JSON 响应中返回 URL 会容易得多,并且客户端可以对该链接执行 GET 以返回文件。

    【讨论】:

    • 这个答案+1。返回 URL 是否被视为最佳做法? (而不是返回整个文件)
    猜你喜欢
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    相关资源
    最近更新 更多