2014-04-30 10 views
20

Istnieje obiekt Request, a pobieranie treści typu żądania jest łatwe. Ale w jaki sposób określasz typ zawartości dla odpowiedzi? Mój kontroler wygląda tak (inne czynności wycięte dla zwięzłości):Jak określić ContentType dla metody kontrolera Web API

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

Działa to dobrze, z tym że ma niewłaściwy typ zawartości. Chciałbym to zrobić. Niewiele badań ujawnia, że ​​możemy wpisać akcję, która zwróci komunikat HttpResponseMessage. Więc koniec mojej metody wyglądałby następująco:

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

Dokumentacja na HttpContent jest raczej rzadki, może ktoś mi doradzić w jaki sposób uzyskać zawartość mojego StringBuilder w produkt HttpContent obiekt?

Odpowiedz

32

Będziesz musiał zmienić typ zwracanej przez metodę HttpResponseMessage, a następnie użyć 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

Aha! To było użycie Request.CreateResponse, którego potrzebowałem. Punkty są wszystkie! (Po prostu spojrzał na MediaTypeFormatter ... dlaczego ktokolwiek zrobiłby to tak skomplikowane?) –

+0

Możesz pominąć "jeszcze" ... Dostaję "Nie można znaleźć formatera pasującego do typu mediów" text/csv ", który może pisać instancja "String"., która mówi mi, że muszę umieścić moją * kompilację łańcuchową * w logice MediaTypeFormatter i powiązać ją z tekstem/csv, i przekazać do niej wynik LINQ poprzez CreateResponse. Dzięki, że mnie tu przesadziłeś. –

+0

Masz rację. Zobacz moją aktualizację. – haim770