1

由于 ASP.NET Web API RC,我使用了一些基于声明 void API 控制器操作的方法。

我正在使用 AOP 和 PostSharp 自定义响应对象DTO(而不是使用 HttpResponseMessage),最后使用HttpContext.Response.Write(...)将 DTO 序列化为 JSON 字符串将其发送到客户端。

当我将解决方案升级到 ASP.NET Web API RTM 时,这种方法不再适用。

每当我从 Web API 发送响应并在客户端收到它时,我发现响应以 204 状态 (NoContent) 发送,而我为响应本身设置 200 状态 (OK)。

因为这种方法适用于 WebAPI 的 RC 版本,所以我怀疑当 WebAPI 开发团队过渡到 RTM 版本时,这是一个未知的重大变化。

我错了吗?

4

2 回答 2

1

我不知道这种重大变化,但我可以确认这在 RTM 中不起作用。无论如何,这是一种错误的使用 Web API 的方法,以至于它不起作用可能是一件好事。如果您要手动编写对客户端的响应,那么您正在扼杀 Web API 的全部意义。如果您有一些无法修改的现有代码执行此操作,那么我建议您使用通用 ASHX 处理程序,直到您准备好升级。

于 2012-09-25T07:19:53.670 回答
1

据我所知,由于 RTM 如果 POST 操作不返回 HttpResponseMessage,则默认状态代码为 204(而不是 RC 中的 200)。我知道,我们可以做两件事来防止客户抱怨 204。

a) 从您的操作中更改响应消息:

[HttpPost]
public HttpResponseMessage DoWork(MyModel model)
{
   // Do work
   return new HttpResponseMessage(HttpStatusCode.OK) { Content = new ObjectContent<MyModel>(model, FormatterConfig.JsonFormatter) };
}

b)更改 DelegatingHandler 中的响应(通过通用方式变脏)

public class ResponseHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var response = base.SendAsync(request, cancellationToken);

        response.Result.StatusCode = response.Result.IsSuccessStatusCode ? System.Net.HttpStatusCode.OK : response.Result.StatusCode;
        return response;
    }
} 
于 2012-09-27T11:11:41.020 回答