我正在尝试使用 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 取决于请求标头。
所以我的核心问题是:我可以在返回不同返回类型的同时利用 ASP.NET MVC 4 Web API 的自动序列化吗?
我考虑过的一些潜在方法是:
让控制器方法返回主要资源类型,但将返回短路
HttpContext.Current.Response
并以某种方式挂钩到自动序列化(首选)。让我的 Model 类更像一个 C 联合,它代表这种类型或那种类型,并让它作为正常返回过程的一部分进行序列化(并且只需覆盖状态代码和所需的任何响应标头)。即使我仔细考虑了如何做到这一点,我感觉它最终仍然会变得非常hacky。
2012 年 4 月 27 日编辑: 我可以像这样抛出 HttpResponseException:
HttpResponseMessage response = new HttpResponseMessage(statusCode);
if (!string.IsNullOrWhiteSpace(text))
{
response.Content = new StringContent(text);
}
throw new HttpResponseException(response);
...但现在我需要弄清楚如何挂钩自动魔术序列化并将其设置response.Content
为Accept
标头协商表示。