2

にデータを追加し、私はHttpResponseMessage戻っている私のWeb 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

はリクエストの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); 
} 
関連する問題