【发布时间】:2016-11-03 13:05:50
【问题描述】:
我的 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 时,我总是得到状态正常。如何获得正确的状态码?
【问题讨论】:
-
在您的帐户控制器中,即使失败或成功,您也只有硬编码返回 httpstatus 代码 OK。您需要移动 try 中的返回值,并在 catch 中添加一个额外的返回值,该返回值在发生错误时使用您想要的状态代码。我建议您对错误消息进行一些解析,或者让您的登录管理器返回一些东西,而不是为不正确或不存在的帐户抛出一些东西,如果它确实是一个错误,您会想要返回 500。
-
是的,我还注意到它总是返回 OK,因为我以硬编码返回 HttpStatusCode.OK。我尝试解决它,但不明白它会将确切的 HttpStatusCode 返回给控制器
标签: c# asp.net-mvc-4 asp.net-web-api2