我有一个看起来像这样的资源:
/users/{id}/summary?format={format}
当format
是“xml”或“json”时,我会回复一个由WCF自动编码的用户摘要对象 - 到目前为止很好。但是当format
等于“pdf”时,我希望我的回复包含一个简单的HTTP响应主体和一个PDF文件附件。
这是怎么做到的?黑客攻击WebOperationContext.Current.OutgoingResponse
似乎不起作用,即使这样做也不会是正确的。包括CDATA部分中的文件位或响应isn't safe中的某些内容。我应该创建Message
的子类,然后提供一个响应它的自定义IDispatchMessageFormatter
吗?我走了一小段路,但最终发现文档不透明。
什么是对的?
答案 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以返回文件。