我有一些代码(详见下文),它使用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);
答案 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
都是非常糟糕的做法。并非每个例外都是客户端故障。