2014-04-30 1 views
20

요청 개체가 있고 요청 콘텐츠 형식을 가져 오는 것은 쉽습니다. 그렇다면 은 응답의 콘텐츠 유형을으로 지정합니까? 내 컨트롤러는 다음과 같습니다 (간결하게하기 위해 다른 작업을 삭제했습니다).웹 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"; 

약간의 연구는 우리가 HttpResponseMessage를 반환하는 작업을 입력 할 수 있음을 보여 할 싶습니다. 그래서 내 방법의 끝은 다음과 같을 것이다 : 내 모두 StringBuilder의 내용을 얻는 방법을

var response = new HttpResponseMessage() ; 
    response.Headers.Add("ContentType","text/csv"); 
    response.Content = //not sure how to set this 
    return response; 
HttpContent에 대한 설명서가 좀 부족

, 사람이 반대 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'의 인스턴스입니다. 이것은 * 문자열을 * Logic을 MediaTypeFormatter에 넣고 text/csv와 연결하고 CreateResponse를 통해 LINQ 결과를 전달해야 함을 알려줍니다. 거기에 고비를 넘겨 줘서 고마워. –

+0

당신 말이 맞아요. 내 업데이트를 참조하십시오. – haim770

관련 문제