Owin 上托管的 WebApi 控制器总是 returns StatusCode 204

WebApi controller hosted on Owin always returns StatusCode 204

我有一些代码(详见下文)使用 HttpClient.PostAsync 在通过 Owin 托管的控制器上调用 WebApi 方法。调用到达正确控制器上的正确方法并按预期工作,直到我检查 HttpResponse 对象的 StatusCode。在我的服务器端代码中,如果出现异常,我要么 return Ok() 要么 BadRequest() 。但是,无论调用 Ok() 还是 BadRequest(),StatusCode 始终为 NoContent (204)。我该如何修复它,使 StatusCode 为 OK (200) 或 BadRequest (400)?

客户端代码:

    public async Task<bool> RegisterUser(string server, string userName, string password)
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri(server);
            var response = await client.PostAsync($"/authentication/user/register?userName={HttpUtility.UrlEncode(userName)}&password={HttpUtility.UrlEncode(password)}", new StringContent(string.Empty));
            return response.StatusCode == HttpStatusCode.OK;
        }
    }

服务器端代码:

    public void Register(string userName, string password)
    {
        try
        {
            _securityService.RegisterUser(userName, password);
        }
        catch (Exception e)
        {
            BadRequest();
            return;
        }

        Ok();
    }

Owin 配置代码:

    var config = new HttpConfiguration();
    config.Routes.MapHttpRoute("AuthenticationApi", "authentication/{controller}/{action}");
    config.DependencyResolver = lifetimeScope.Resolve<IDependencyResolver>();
    app.UseWebApi(config);

您忘记了 return 您的 api 方法中的任何内容 - 现在只是 returns void。因此,对于任何请求,您都会得到 No Content。是的,您调用了创建不同操作结果(BadRequest 和 Ok)的辅助方法,但这些操作结果不是 return 从控制器方法编辑的,因此 WebApi 基础结构不使用它来构建响应消息。

所以你应该让你的方法return适当的行动结果:

public IHttpActionResult Register(string userName, string password)
{
    try
    {
        _securityService.RegisterUser(userName, password);
    }
    catch (Exception e)
    {
        return BadRequest();
    }

    return Ok();
 }

请注意,returning BadRequest 任何异常都是一种非常糟糕的做法。并非每个异常都是客户端错误。