2014-04-30 60 views
20

有一個Request對象,並且獲取請求內容類型很容易。但你如何指定一個內容類型的響應?我的控制器看起來像這樣(切除爲了簡潔其他操作):如何爲Web API控制器方法指定ContentType

public class AuditController : ApiController 
{ 
    // GET api/Audit/CSV 
    [HttpGet, ActionName("CSV")] 
    public string Csv(Guid sessionId, DateTime a, DateTime b, string predicate) 
    { 
    var result = new StringBuilder(); 
    //build a string 
    return result.ToString(); 
    } 
} 

這工作,除了它有錯誤的內容類型的罰款。我想這樣做

Response.ContentType = "text/csv"; 

有點研究表明,我們可以鍵入Action返回一個HttpResponseMessage。所以我的方法的結尾是這樣的:

var response = new HttpResponseMessage() ; 
    response.Headers.Add("ContentType","text/csv"); 
    response.Content = //not sure how to set this 
    return response; 

上HttpContent的文檔是相當稀少,誰能告訴我如何得到我的StringBuilder的內容放入HttpContent對象?

回答

32

你必須在方法的返回類型更改爲HttpResponseMessage,然後使用Request.CreateResponse

// GET api/Audit/CSV 
[HttpGet, ActionName("CSV")] 
public HttpResponseMessage Csv(Guid sessionId, DateTime a, DateTime b, string predicate) 
{ 
    var result = new StringBuilder(); 

    //build a string 

    var res = Request.CreateResponse(HttpStatusCode.OK); 
    res.Content = new StringContent(result.ToString(), Encoding.UTF8, "text/csv"); 

    return res; 
} 
+0

啊哈!這是我需要的Request.CreateResponse的使用。點都是你的! (剛看過MediaTypeFormatter ...爲什麼有人會讓它變得如此複雜?) –

+0

你可以省略「yet」...我得到了'找不到可以寫入的媒體類型'text/csv'的格式化程序'String'的一個實例,它告訴我需要將我的*構建字符串*邏輯放入MediaTypeFormatter中,並將其與text/csv關聯,並通過CreateResponse將LINQ結果傳遞給它。謝謝你讓我在那裏的駝峯。 –

+0

你說得對。查看我的更新。 – haim770