2010-06-07 96 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