C# ASP.NET Web API有条件返回HttpResponseMessage

C# ASP.NET Web API有条件返回HttpResponseMessage,c#,asp.net,asp.net-web-api,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(

我有一个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;
    } 

这一直很有效。问题在于,在某些情况下,请求者并不期望得到响应。我不知道如何不给发布到url的请求者一个响应。我怎样才能像上面那样返回一个响应,并且还可以选择让函数不给出一个响应,本质上是一个无效函数?

您应该始终返回一个响应。当您不想在响应中发送内容时,会有一个状态代码
204
。根据规范:

10.2.5 204无内容

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

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

204响应不能包括消息体,因此总是由头字段后的第一个空行终止

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

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

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

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

对于HTTP服务器来说,这似乎是一件奇怪的事情,但如果这是您真正需要的,请尝试一下。如果随后抛出异常,则不会向客户端发送错误,因为您已经结束了响应。

即使是void方法也会向调用API的客户端返回HTTP状态代码。看到这个了吗


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

谢谢您的回答。我刚刚试过,但是发送请求的应用程序有一个错误,因为它接收到一个非200 HTTP状态码。我试图遵守的应用程序文档中说,“您的服务无法返回对SessionedRequest的响应。”这就是为什么我想知道是否有某种方法有时不从我的控制器返回任何内容。啊,我明白了。好吧,如果来电者是一个行为正常的客户,这将是一个很好的答案,但看起来你必须做一些不同的事情。添加了一个替代答案。现在还不清楚“无法发回响应”是什么意思,但如果这意味着只是结束响应,它可能对你有用。真正的问题是我不知道如何打断“无法发回响应”。我原以为下面的答案会有效,但应用程序抛出另一个错误,表示与我的错误通信时出现问题。这使我相信应用程序实际上期望得到某种响应。我想我必须在applications developer论坛上四处询问,以获得关于协议是什么的澄清。谢谢你的帮助,我同意
sessionedrequest
可能有某种特定的含义。祝你好运