Web API:向HttpResponseMessage添加数据

3

我在我的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-Typeapplication/xml,我应该使用xml formatter来放置响应的主体。

是否有一种方法可以使用通用类,并让框架根据请求的内容类型在运行时决定使用哪个格式化程序?

2个回答

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;
    }

}

返回的类型应该基于请求所需接受的内容为最佳选择。框架在这个主题上允许灵活性。

查看此 ASP.NET Web API中的内容协商 以获取更多信息。


我已经完成了这个任务,请求是一个xml格式的,而响应却是json格式的……我不知道为什么。 - Buda Gavril
根据请求的Accept头部信息,如果您想强制基于请求的内容类型生成内容,请从请求中获取它并包含在创建响应的重载方法中。Request.CreateResponse(HttpStatusCode.OK, response, Request.Content.Headers.ContentType); - Nkosi
这样,响应内容类型将基于请求内容类型。 - 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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接