2014-04-30 3 views
20

Es gibt ein Request-Objekt, und es ist einfach, den Inhaltstyp der Anfrage abzurufen. Aber wie geben Sie einen Inhaltstyp für die Antwort angeben? Mein Controller sieht wie folgt aus (andere Aktionen der Kürze ausgeschnitten):So geben Sie ContentType für die Web-API-Controller-Methode an

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(); 
    } 
} 

Diese Ausnahme gut funktioniert, dass sie den falschen Inhaltstyp hat. Ich möchte diese

Response.ContentType = "text/csv"; 

Ein wenig Forschung tun, zeigt, dass wir den Aktionstyp kann eine HttpResponseMessage zurückzukehren. Also das Ende meiner Methode würde wie folgt aussehen:

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

Die Dokumentation auf HttpContent eher spärlich ist, kann jemand mir raten, wie der Inhalt meines String in eine HttpContent zu bekommen Objekt?

Antwort

32

Sie werden den Rückgabetyp der Methode HttpResponseMessage ändern müssen, dann Request.CreateResponse verwenden:

// 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

Aha! Es war die Verwendung von Request.CreateResponse, die ich brauchte. Punkte sind alle deine! (Ich habe mir MediaTypeFormatter angeschaut ... warum sollte jemand das so kompliziert machen?) –

+0

Sie können "noch" auslassen ... Ich bekomme 'Konnte keinen Formatierer finden, der dem Medientyp 'text/csv' entspricht, der schreiben kann eine Instanz von "String". Das sagt mir, dass ich meine * string * -Logik in eine MediaTypeFormatter einbauen und sie mit text/csv assoziieren muss und das LINQ-Ergebnis über CreateResponse an sie übergeben muss. Danke, dass du mich über den Buckel gebracht hast. –

+0

Sie haben Recht. Siehe mein Update. – haim770

Verwandte Themen