【问题标题】:WebApi controller hosted on Owin always returns StatusCode 204托管在 Owin 上的 WebApi 控制器始终返回 StatusCode 204
【发布时间】:2017-04-26 13:59:23
【问题描述】:

我有一些代码(详见下文)使用 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);

【问题讨论】:

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


【解决方案1】:

您忘记从您的 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 是一种非常糟糕的做法。并非所有异常都是客户端错误。

【讨论】:

  • 这修复了它。谢谢!我还在学习如何使用 WebApi,但我觉得有点傻,错过了这么基本的东西。
  • @AndyClark 也考虑使用 POST 请求到/api/users/ 端点来创建(即注册新用户)——这将是更 RESTful 的方式
猜你喜欢
  • 2018-11-22
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 2015-06-12
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
相关资源
最近更新 更多