代码之家  ›  专栏  ›  技术社区  ›  David Seiler

将文件附加到WCF REST服务响应

  •  5
  • David Seiler  · 技术社区  · 14 年前

    我有一个类似这样的资源:

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

    什么时候? format 是“xml”还是“json”,我用一个用户摘要对象作出响应,到目前为止,该对象由wcf-fine自动编码。但是什么时候 格式 等于“pdf”,我希望我的响应由一个普通的HTTP响应主体和一个PDF文件附件组成。

    怎么做到的?黑客攻击 WebOperationContext.Current.OutgoingResponse 似乎不起作用,即使这样也不会是正确的事情。包括cdata部分或响应中的文件位 isn't safe . 我应该创建一个子类吗 Message ,然后提供自定义 IDispatchMessageFormatter 有什么反应?我沿着这条路走了很短的距离,但最终发现文档是不透明的。

    什么是正确的?

    2 回复  |  直到 14 年前
        1
  •  6
  •   David Seiler    14 年前

    事实证明,我需要的是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.
        }
    }
    
        2
  •  3
  •   Darrel Miller    14 年前

    理论上,您可以使用多部分内容的mime类型(请参见 http://www.faqs.org/rfcs/rfc2387.html )但是,在XML/JSON响应中返回URL要容易得多,客户机可以执行一个GET ON链接来返回文件。