ASP.NET Web API有条件地返回HttpResponseMessage

时间:2015-08-19 19:58:55

标签: c# asp.net asp.net-web-api

我有一个ASP.NET Web API,我一直在用这种格式回复请求,

    [HttpPost]
    [Route("")]
    public HttpResponseMessage AlexaSkill()
    {
        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "value");
        response.Content = new StringContent("put json here", Encoding.UTF8);
        response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); 

        return response;
    } 

这一直很有效。问题是在某些情况下请求者不期望得到响应。我无法弄清楚如何不对发布到网址的请求者做出回应。我怎样才能返回上面的响应,并且还可以选择让函数不给出基本上作为void函数的响应?

3 个答案:

答案 0 :(得分:4)

您应该始终返回回复。当您不想在回复中发送内容时,会显示状态代码204。来自规范:

  

10.2.5 204无内容

     

服务器已完成请求但不需要返回实体主体,并且可能希望返回更新的元信息。响应可以包括实体标题形式的新的或更新的元信息,如果存在,应该与所请求的变体相关联。

     

如果客户端是用户代理,则它不应该从导致请求发送的文档视图中更改其文档视图。此响应主要是为了允许在不导致更改用户代理的活动文档视图的情况下进行操作的输入,尽管任何新的或更新的元信息应该应用于当前在用户代理的活动视图中的文档。

     

204响应绝不能包含消息体,因此总是在头字段后面的第一个空行终止。

所以你的代码可能是这样的:

[HttpPost]
public HttpResponseMessage SomeMethod()
{
    // Do things
    return Request.CreateResponse(HttpStatusCode.NoContent);
} 

答案 1 :(得分:4)

即使是void方法也会将HTTP状态代码返回给调用API的客户端。见link

您可能需要向客户要求更改或其他替代方案。

答案 2 :(得分:1)

如果您想终止请求,请尝试以下操作:

HttpContext.Current.Response.End();
throw new Exception("Terminating request.");

对于HTTP服务器来说,这似乎是一件奇怪的事情,但如果那是你真正所需要的,那就试一试吧。如果您跟随抛出异常,则错误将无法发送到客户端,因为您已经结束了响应。