【问题标题】:I have Created a Web API but when i call it in controller then it always gives same StatusCode i.e "OK"我已经创建了一个 Web API,但是当我在控制器中调用它时,它总是给出相同的 StatusCode,即“OK”
【发布时间】: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


【解决方案1】:

应该返回 200 OK。在基于从 Web Api 请求返回的状态代码的 switch 语句中,如果返回 200,则执行临时重定向。临时重定向实际上是 301,但 Web 浏览器通过在重定向中发出新的 URL 请求来响应,并且该请求的响应(假设一切正常)将是 200。

如果您的 Web Api 返回错误状态代码,您将返回一个视图,该视图将生成 200(再次假设返回该视图一切正常)。

这实际上是应该的。您的 Web Api 失败的事实不应传播到您的 MVC 响应中。从用户的角度来看,它们要么被重定向,要么被返回到带有错误消息的前一个视图。那是理想的。您不希望向用户返回 500,因为 Web Api 返回了 500。然后用户被卡在错误页面上。相反,您可以优雅地恢复,向用户发送响应(作为 200),其中包括一条消息,说明他们的请求无法处理,稍后再试等等。换句话说,您解释出了什么问题,但是您仍在向用户提供成功的响应。

这真的是两种不同的东西。向用户提供成功的响应并不意味着一切都按应有的方式发生。它只是意味着浏览器有一些可以使用的东西,可以呈现给用户的东西。在这种情况下,这就是您想要的,因为用户需要了解所发生的事情,能够纠正他们的错误等等。

【讨论】:

  • 当我使用实际身份验证或我使用错误的身份验证并登录时,它总是返回 200。当我输入错误的身份验证时,我如何防止它不应该登录?
  • 我看不到您实际进行任何登录的地方。您只是从 Web Api 获取用户。如果成功,则您正在重定向,否则,您将返回错误消息。看起来您的 Web Api 操作可能正在执行登录,但这实际上是错误的。 Web Api 无法访问Session,这对于真正让某人“登录”是非常必要的。此外,即使您确实有权访问,它也会为该 Web Api 设置它,而不是您的 MVC 站点。相反,您的 Web Api 应该只返回登录信息是否签出。
  • 然后,如果有“真”响应,您的 MVC 操作应该让用户登录,如果有“假”响应,则返回错误。并不是说它必须是布尔值;这只是你确定真实性的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多