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

时间:2010-06-07 18:30:39

标签: wcf rest

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

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

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

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

什么是对的?

2 个答案:

答案 0 :(得分:6)

事实证明,我需要的是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.
    }
}

答案 1 :(得分:3)

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