2

我在我的網頁API的作用是返回一個HttpResponseMessage網頁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

基於請求的accept頭。如果要根據請求的內容類型強制內容,請將其從請求中取出並將其包含在創建響應重載中。 '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); 
}