ASP.NET Web API 的不同返回类型

本文关键字:返回类型 API NET Web ASP | 更新日期: 2023-09-27 18:32:16

我正在尝试使用 ASP.NET MVC 4 Web API通过HTTP编写真正的RESTful Web服务。

我目前面临的挑战是根据我的状态代码返回不同的返回类型(实体正文)。

例如,对于资源 Hammer,我有一个 .NET 模型类"Hammer"和一个 HammerController:

namespace Awesomeness
{
    public class HammerController : ApiController
    {
        public Hammer Get(int id)
        {
        }
...

如果 ID 不存在 (404) 或需要不同的授权 (401),我可以轻松地快捷方式返回并手动设置状态代码和任何其他内容,这很酷。 但是,在许多非 2xx 状态中,我想返回与 Hammer 资源表示不同的实体主体。 我可以轻松地手动执行此操作,但我想利用 ASP.NET MVC 4 Web API 自动序列化和反序列化到 XML 或 JSON 或 JSON,具体取决于请求标头。

所以我的核心问题是:我能否利用 MVC 4 Web API ASP.NET 自动魔术序列化,同时返回不同的返回类型?

我考虑过的一些潜在方法是:

  1. 让控制器方法返回主资源类型,但使用 HttpContext.Current.Response 短路返回,并以某种方式挂钩到自动魔法序列化(首选)。

  2. 让我的 Model 类更像一个 C 联合,它表示这个类型或那个类型,并让它作为正常返回过程的一部分进行序列化(并且只覆盖状态代码和所需的任何响应标头)。 即使我仔细考虑如何做到这一点,我有一种感觉,它最终仍然会非常笨拙。

编辑 Apr 27 2012: 我可以像这样抛出一个 HttpResponseException:

HttpResponseMessage response = new HttpResponseMessage(statusCode);
if (!string.IsNullOrWhiteSpace(text))
{
    response.Content = new StringContent(text);
}
throw new HttpResponseException(response);

。但现在我需要弄清楚如何挂接到自动魔术序列化并将response.Content设置为Accept标头协商表示。

ASP.NET Web API 的不同返回类型

我从另一个问题的答案中得出了这个问题的干净答案。

如果我使我的返回值HttpResponseMessage,我可以通过返回new HttpResponseMessage()来返回我需要的任何状态或内容。

编辑 5/10/2012:感谢@DarrelMiller的输入,删除了已弃用的HttpResponseMessage<T>,并替换为调用HttpRequestMessage.CreateResponse<T>()扩展方法。 注意:此扩展方法在 MVC4/WebAPI 测试版中不可用。 您需要从源代码构建或获取夜间构建。

过度简化的示例:

public HttpResponseMessage Post(MyResource myResource)
{
    ...
    if (goodStuff)
    {
        return ControllerContext.Request.CreateResponse(HttpStatusCode.Created, myNewResource);
    }
    else if (badStuff)
    {
        return ControllerContext.Request.CreateResponse(HttpStatusCode.BadRequest, badRequest);
    }
    else
    {
        return new HttpResponseMessage(HttpStatusCode.InternalServerError);
    }
}