2

에 데이터를 추가 나는 HttpResponseMessage 반환 내 웹 API에서 작업이 있습니다, 내 문제는 지금웹 API는 다음 HttpResponseMessage

public async Task<HttpResponseMessage> Create([FromBody] AType payload) 
{ 
    if (payload == null) 
    { 
     throw new ArgumentNullException(nameof(payload)); 
    } 

    await Task.Delay(1); 

    var t = new T { Id = 0, Name = payload.tName, Guid = Guid.NewGuid() }; 

    var response = new MyResponse { T = t }; 

    var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ObjectContent(typeof(MyResponse), response, new JsonMediaTypeFormatter { SerializerSettings = { NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore } }) }; 

    return result; 
} 

을 그 요청이와 요청의 Content-Typeapplication/xml 인 경우, 나는 응답의 시신을 xml formatter을 써야한다.

제네릭 클래스를 사용하고 프레임 워크가 요청의 콘텐츠 유형을 기반으로 런타임에 어떤 포맷터를 사용할 지 결정하는 방법이 있습니까?

답변

1

요청에 대해 CreateResponse 확장 방법을 사용하면 연결된 요청을 기반으로 콘텐츠 협상을 허용합니다. 요청의 콘텐츠 형식에 따라 콘텐츠 형식을 강제로 지정하려면 요청에서 가져 와서 응답 만들기 오버로드에 포함시킵니다.

public class MyApitController : ApiController { 
    [HttpPost] 
    public async Task<HttpResponseMessage> Create([FromBody] AType payload) { 
     if (payload == null) { 
      throw new ArgumentNullException(nameof(payload)); 
     } 

     await Task.Delay(1); 

     var t = new T { Id = 0, Name = payload.tName, Guid = Guid.NewGuid() }; 

     var response = new MyResponse { T = t }; 

     var contentType = Request.Content.Headers.ContentType; 

     var result = Request.CreateResponse(HttpStatusCode.OK, response, contentType); 

     return result; 
    } 

} 

반환되는 유형은 요청에서 받아들이려는 내용을 기준으로하는 것이 이상적입니다. 프레임 워크는 해당 주제에 유연성을 허용합니다. 더 많은 정보 Content Negotiation in ASP.NET Web API

+0

나는이 작업을 수행했으며 요청은 xml이고 응답은 json ... 이유를 모르겠다. –

+0

요청의 수락 헤더를 기반으로. 요청의 콘텐츠 유형에 따라 콘텐츠를 강제로 적용하려면 요청에서 가져 와서 응답 생성 과부하에 포함 시키십시오. 'Request.CreateResponse (HttpStatusCode.OK, response, Request.Content.Headers.ContentType); ' – Nkosi

+0

응답 내용 유형은 요청 내용 유형을 기반으로합니다. – Nkosi

0

이 작업을 수행하는 쉬운 방법에 대한

확인이 웹 API 2 ApiController에 편리한 방법을 사용하는 것입니다.

[HttpPost] 
public async Task<IHttpActionResult> Create([FromBody] AType payload) 
{ 
    if (payload == null) 
    { 
     return BadRequest("Must provide payload"); 
    } 

    await Task.Delay(1); 

    var t = new T { Id = 0, Name = payload.tName, Guid = Guid.NewGuid() }; 

    var response = new MyResponse { T = t }; 

    return Ok(response); 
}