我已经创建了一个Web API,但当我在控制器中调用它时,它总是给出相同的StatusCode即"OK&quo
本文关键字:OK quo quot StatusCode 创建 一个 控制器 Web API 调用 | 更新日期: 2023-09-27 18:16:13
我的API代码如下所示,其中我们创建了登录API:
public class AccountController : ApiController
{
private static readonly ILogWrapper Log = LogManagerWrapper.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private ApplicationSignInManager _signInManager;
/// <summary>
/// Gets this instance.
/// </summary>
/// <returns>HttpResponseMessage.</returns>
///
public ApplicationSignInManager SignInManager
{
get
{
return _signInManager ?? HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>();
}
private set { _signInManager = value; }
}
/// <summary>
/// Gets this instance.
/// </summary>
/// <returns>HttpResponseMessage.</returns>
///
[HttpGet]
public async Task<HttpResponseMessage> Get(string email,string password,bool remember)
{
var result = SignInStatus.Failure;
try
{
result = await SignInManager.PasswordSignInAsync(email, password, remember, shouldLockout: false);
}
catch (Exception ex)
{
Log.Error("Error in login = " + ex.Message, ex);
}
return Request.CreateResponse(HttpStatusCode.OK, result);
}
}
控制器代码为:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
// This doen't count login failures towards lockout only two factor authentication
// To enable password failures to trigger lockout, change to shouldLockout: true
var code = HttpStatusCode.NotFound;
try
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:52958/");
client.DefaultRequestHeaders.Accept.Clear();
var res = await client.GetAsync("api/Account/Get?email=" + model.UserName + "&password=" + model.Password + "&remember=" + model.RememberMe + "");
code = res.StatusCode;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
switch (code)
{
case HttpStatusCode.OK:
return RedirectToLocal(returnUrl);
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
当我通过swagger执行这个API时,它会很好地响应,如果身份验证细节正确,它总是显示成功,否则它会给出失败,但是当我通过控制器调用这个API时,我总是得到状态是OK的。我如何得到正确的状态码?
It 应该返回200 OK。在基于从Web Api请求返回的状态码的switch语句中,如果返回200,则执行临时重定向。临时重定向实际上是301,但web浏览器通过对重定向中的URL发出新的请求来响应,并且该请求的响应(假设一切正常)将是200。
如果您的Web Api返回一个错误状态码,您将返回一个视图,该视图将产生一个200(再次假设返回该视图的一切正常)。
实际上应该是这样的。Web Api失败的事实不应该传播到MVC响应中。从用户的角度来看,它们要么被重定向,要么返回到带有错误消息的前一个视图。这是理想的。您不希望因为Web Api返回了500而向用户返回500。然后用户被困在一个错误页面。相反,您优雅地恢复,向用户交付一个响应(作为一个200),其中包含一条消息,说他们的请求无法处理,稍后再试,等等。换句话说,你解释了哪里出了问题,但你仍然向用户提供了一个成功的响应。
这是两码事。向用户交付一个成功的响应并不意味着一切都按照预期发生了。它只是意味着浏览器有一些可以处理的东西,一些可以呈现给用户的东西。在这个场景中,这就是你想要的,因为用户需要被告知发生了什么,有能力修复他们的错误,等等。