2

У меня есть действие в моем веб-API, который возвращающую HttpResponseMessage:Web 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-Type является application/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

простой способ сделать это, чтобы использовать удобные методы в Web 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); 
} 
Смежные вопросы