Mik*_*sen 10 c# asp.net-web-api
我正在尝试使用ASP.NET MVC 4 Web API在HTTP上编写真正的RESTful Web服务.
我目前面临的挑战是根据我的状态代码返回不同的返回类型(entity-body).
例如,对于资源Hammer,我有一个.NET模型类"Hammer"和一个HammerController:
namespace Awesomeness
{
public class HammerController : ApiController
{
public Hammer Get(int id)
{
}
...
Run Code Online (Sandbox Code Playgroud)
如果ID不存在(404)或需要不同的授权(401),我可以轻松地快速返回并手动设置状态代码和任何其他内容,这很酷.但是,在许多非2xx状态中,我想返回一个与Hammer资源表示不同的实体.我可以轻松地手动执行此操作,但我希望根据请求标头利用ASP.NET MVC 4 Web API自动序列化和反序列化到XML或JSON.
所以我的核心问题是:我可以利用ASP.NET MVC 4 Web API的自动序列化同时返回不同的返回类型吗?
我想到的一些潜在方法是:
有控制器方法返回主资源类型,但短路返回HttpContext.Current.Response并以某种方式挂钩到自动序列化(首选).
让我的Model类更像是一个C union,它表示这种类型或那种类型,并让它作为正常返回过程的一部分进行序列化(并且只需覆盖状态代码和所需的任何响应头).即使我想通过如何做到这一点,我仍然觉得它最终会变得非常黑客.
编辑2012年4月27日: 我可以像这样抛出一个HttpResponseException:
HttpResponseMessage response = new HttpResponseMessage(statusCode);
if (!string.IsNullOrWhiteSpace(text))
{
response.Content = new StringContent(text);
}
throw new HttpResponseException(response);
Run Code Online (Sandbox Code Playgroud)
...但现在我需要弄清楚如何挂钩到自动魔术序列化并设置response.Content为Accept标头协商表示.
Mik*_*sen 16
我从我收到的答案得出的干净回答这个问题,这个问题等.
如果我返回值HttpResponseMessage,我可以通过返回a返回我需要的任何状态或内容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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15471 次 |
| 最近记录: |