HttpResponseMessage 객체에 내용을 넣습니까?


180

몇 달 전에 Microsoft는 HttpResponseMessage 클래스를 변경하기로 결정했습니다. 이전에는 데이터 형식을 생성자에 전달한 다음 해당 데이터가 포함 된 메시지를 더 이상 반환 할 수 없었습니다.

이제 Content 속성을 사용하여 메시지의 내용을 설정해야합니다. 문제는 HttpContent 유형이며 문자열을 HttpContent로 변환하는 방법을 찾지 못하는 것입니다.

누구 든지이 문제를 해결하는 방법을 알고 있습니까? 고마워

답변:


216

구체적으로 문자열의 경우 가장 빠른 방법은 StringContent 생성자 를 사용하는 것입니다

response.Content = new StringContent("Your response text");

다른 일반적인 시나리오에 대한 추가 HttpContent 클래스 하위 항목 이 많이 있습니다.


고유 한 파생 된 StringContent 유형 (예 : JSON, XML 등)을 작성하려면 아래 내 게시물을 참조하십시오.
bytedev

135

Request.CreateResponse를 사용하여 응답을 작성해야합니다 .

HttpResponseMessage response =  Request.CreateResponse(HttpStatusCode.BadRequest, "Error message");

문자열뿐만 아니라 객체를 CreateResponse에 전달할 수 있으며 요청의 Accept 헤더에 따라 객체를 직렬화합니다. 이렇게하면 포맷터를 수동으로 선택하지 않아도됩니다.


당신이 할 수 있도록 자동으로 콘텐츠 형식으로 작동하는 XML / JSON 추가 코드없이

CreateErrorResponse()이 답변의 예에서와 같이 응답이 오류 인 경우 전화 하는 것이 더 정확하다고 생각합니다 . 내 시도 - 캐치 내부 내가 사용하고 있습니다 : this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "message", exception); 그리고 당신은 발신자의 헤더를 수락 존중에 대해 모든 관련에 있다면, 이것은 정답, 여분의 속임없이 (당신은 WebAPI를 사용).
JMD

2
@FlorinDumitrescu 그의 요점은 당신이 상속 할 때만 작동한다는 것 ApiController입니다. 상속 ControllerHttpResponseMessage msg = new HttpResponseMessage(); msg.Content = new StringContent("hi"); msg.StatusCode = HttpStatusCode.OK;
만하

64

분명히 새로운 방법은 다음과 같습니다.

http://aspnetwebstack.codeplex.com/discussions/350492

헨릭을 인용하자면

HttpResponseMessage response = new HttpResponseMessage();

response.Content = new ObjectContent<T>(T, myFormatter, "application/some-format");

따라서 기본적으로 ObjectContent 유형을 작성해야하며 HttpContent 객체로 반환 될 수 있습니다.


31
myFormatter 란 무엇입니까
Greg Z.

1
@ user1760329 new JsonMediaTypeFormatter();형식에 따라 비슷하거나 비슷할 것입니다
John

1
ObjectContentWCF를 사용하여 찾을 수 없습니다
Medet Tleukabiluly에게

2
나는 이것을 "새로운 방법"으로 인정하지 않을 것이다-당신이 참조하는 기사는 당신이 사용하고자하는 [미디어 타입] 포매터를 완전히 제어하고 싶을 때 그것을 대안으로 제시한다.
베른

@praetor 감사합니다. 이것은 정말 나에게 도움이되었습니다
SO User

53

가장 쉬운 단선 솔루션은

return new HttpResponseMessage( HttpStatusCode.OK ) {Content =  new StringContent( "Your message here" ) };

직렬화 된 JSON 컨텐츠의 경우 :

return new HttpResponseMessage( HttpStatusCode.OK ) {Content =  new StringContent( SerializedString, System.Text.Encoding.UTF8, "application/json" ) };

IHttpActionResult에는 반환 유형의 ResponseMessageResult가 필요하기 때문에 이것은 작동하지 않았습니다. 내가 끝낸 것에 대해서는 아래 답변을 참조하십시오. 또한 Nashawn의 JsonContent (StringContent 기본 클래스에서 파생 됨)를 고려했습니다.
Adam Cox

1
HttpResponseMessage를 랩핑 한 후 다음을 리턴하십시오. return new ResponseMessageResult (return new HttpResponseMessage (HttpStatusCode.OK) {new StringContent ( "Your message here")}); :)
Simon Mattes

41

모든 T 객체에 대해 다음을 수행 할 수 있습니다.

return Request.CreateResponse<T>(HttpStatusCode.OK, Tobject);

5
상속하는 경우 메소드 Request에서만 예외 를 사용할 수 있습니다 . 를 사용하면 작동하지 않습니다 . CreateResponseApiControllerController
vapcguy

15

고유 한 특수 컨텐츠 유형을 작성할 수 있습니다. 예를 들어 Json 컨텐츠와 Xml 컨텐츠를위한 것 (HttpResponseMessage.Content에 할당) :

public class JsonContent : StringContent
{
    public JsonContent(string content)
        : this(content, Encoding.UTF8)
    {
    }

    public JsonContent(string content, Encoding encoding)
        : base(content, encoding, "application/json")
    {
    }
}

public class XmlContent : StringContent
{
    public XmlContent(string content) 
        : this(content, Encoding.UTF8)
    {
    }

    public XmlContent(string content, Encoding encoding)
        : base(content, encoding, "application/xml")
    {
    }
}

매우 깔끔하고 깨끗한 구현.
Sam

3

Simon Mattes의 답변에서 영감을 얻은 IHttpActionResult 필수 반환 유형의 ResponseMessageResult를 충족해야했습니다. 또한 nashawn의 JsonContent를 사용하여 결국 ...

        return new System.Web.Http.Results.ResponseMessageResult(
            new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK)
            {
                Content = new JsonContent(JsonConvert.SerializeObject(contact, Formatting.Indented))
            });

JsonContent에 대한 nashawn의 답변을 참조하십시오.


문자열 보간이 불필요한 것 같습니다
Igor Pashchuk

0

의심 할 바없이 당신은 Florin이 맞습니다. 나는이 프로젝트에서 일하고 있었고이 코드 조각을 발견했다.

product = await response.Content.ReadAsAsync<Product>();

다음으로 대체 될 수 있습니다.

response.Content = new StringContent(string product);

1
이 답변은 질문과 관련이없는 것처럼 보이며 객체 (제품)에서 문자열로 이동하는 방법을 보여주지 않습니다.
mageos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.