2010-06-07 93 views
5

我有一个看起来像这样的资源:将文件附加到WCF REST服务响应

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

format为“XML”或“JSON”我是被自动地通过WCF编码的用户摘要对象响应 - 至今为止。但是当format等于“pdf”时,我希望我的回复包含一个简单的HTTP响应正文和一个PDF文件附件。

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

什么是正确的?

回答

6

事实证明,我需要的是WCF“原始”模式,如here所述。一般来说,我想这样做:

[OperationContract, WebGet(UriTemplate = "https://stackoverflow.com/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. 
    } 
} 
+0

嗨,只是好奇,如果你可以分享你如何设置客户端绑定为此工作... – 2010-07-08 15:58:54

+0

没有一个,它是REST,你打一个URL并获得一个HTTP响应。我误解你了吗? – 2010-07-09 22:27:18

3

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

+0

+1对此答案。是否返回被认为是最佳实践的网址? (而不是返回整个文件) – rexposadas 2012-07-16 20:05:57