我已经创建了一个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的。我如何得到正确的状态码?

我已经创建了一个Web API,但当我在控制器中调用它时,它总是给出相同的StatusCode即"OK&quo

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

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

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

这是两码事。向用户交付一个成功的响应并不意味着一切都按照预期发生了。它只是意味着浏览器有一些可以处理的东西,一些可以呈现给用户的东西。在这个场景中,这就是你想要的,因为用户需要被告知发生了什么,有能力修复他们的错误,等等。