在Owin上托管的WebApi控制器总是返回StatusCode 204

时间:2017-04-26 13:59:23

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

我有一些代码(详见下文),它使用HttpClient.PostAsync在通过Owin托管的控制器上调用WebApi方法。调用在适当的控制器上达到正确的方法并按预期工作,直到我检查HttpResponse对象的StatusCode。在我的服务器端代码中,如果发生异常,我会返回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);

1 个答案:

答案 0 :(得分:2)

你忘记从api方法返回任何内容 - 它现在只返回void。因此,您可以获得No Content任何请求。是的,您调用创建不同操作结果的辅助方法(BadRequest和Ok),但这些操作结果不会从控制器方法返回,因此WebApi基础结构不会使用它来构建响应消息。

所以你应该让你的方法返回适当的动作结果:

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

    return Ok();
 }

请注意,为任何异常返回BadRequest都是非常糟糕的做法。并非每个例外都是客户端故障。