【问题标题】:Asp.net redirect to action failed with status code 500Asp.net 重定向到操作失败,状态码为 500
【发布时间】:2021-12-09 13:48:03
【问题描述】:

目前我正在开发一个简单的 asp.net 应用程序的登录功能。登录功能使用 SweetAlert 作为表单收集器,并将 ajax 发送到后端以登录用户。登录功能以某种方式起作用,因为我对其进行了调试,并且它进入了成功案例。问题似乎发生在 Success 下的代码上,它需要使用给定的 url 重定向到操作。这是我的代码:

前端

 function login() {
        Swal.fire({
            // some sweet alert stuff
        }).then((result) => {
            if (!result.isConfirmed) return;

            var data = {
                __RequestVerificationToken: gettoken(),
                email: result.value.username,
                password: result.value.password,
                returnUrl:"@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue.ToString()/@ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString()"

            }
/*            console.log(data)*/

            $.ajax({
                type: "POST",
                url: '/Account/Login',
                data: data,
                contentType: "application/x-www-form-urlencoded; charset=utf-8",
                dataType: "json",
                success: function (response) {
                    console.log(response)
                    if (!response.success) onFail("Your username or password is incorrect.", login);
                },
                error: function (response) {
                    console.log(response)
                    onFail("Internal error, please try again", login)
                }
            })
        })
    }

后端

// POST: /Account/Login
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }

            var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
            switch (result)
            {
                case SignInStatus.Success:
                    string[] parsedUrl = returnUrl.Split('/');
                    return RedirectToAction(parsedUrl[1], parsedUrl[0]);
                case SignInStatus.LockedOut:
                    return View("Lockout");
                case SignInStatus.RequiresVerification:
                    return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
                case SignInStatus.Failure:
                    return Json(new { success = false, html = "", message = "Internal Error" });
                default:
                    ModelState.AddModelError("", "Invalid login attempt.");
                    return View(model);
                    
            }
        }

下面是回复:

Request URL: https://localhost:44354/Account/Login
Request Method: POST
Status Code: 302 
Remote Address: [::1]:44354
Referrer Policy: strict-origin-when-cross-origin

我认为问题发生在后端Login() 中的 return RedirectToAction(parsedUrl[1], parsedUrl[0]);。我尝试将参数直接设置为returnUrl,但仍然不起作用。该网页不会重定向到任何地方。而是转到前端ajax中的错误块,弹出内部错误信息。

任何建议将不胜感激。

--------------编辑-------- ------------

找到了status 302的原因,是因为我在ajax中指定了响应类型是Json,但是后端返回的是RedirectToAction()。但我仍然需要一些建议。我删除dataType: "json",它会响应状态500。在这种情况下,我应该如何在登录后重定向用户?

【问题讨论】:

    标签: c# html asp.net asp.net-mvc-4 redirect


    【解决方案1】:

    看起来您正在使用单个控制器操作来处理 JSON/API 调用和常规 HTML 页面请求:

                    case SignInStatus.LockedOut:
                        return View("Lockout");
                    case SignInStatus.RequiresVerification:
                        return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
                    case SignInStatus.Failure:
                        return Json(new { success = false, html = "", message = "Internal Error" });
                   
    

    常规页面请求和 API 调用的行为不同。

    一般来说:

    • 常规页面请求需要 HTML 响应,并且会自动遵循重定向。
    • API 调用需要 JSON 响应并且不遵循重定向。

    如果您想从 API 调用中获得重定向行为,则必须手动执行此操作:

    1. 检查状态码(等于302
    2. Location响应头中提取url
    3. 使用 JavaScript 将用户重定向到此 URL:window.location.href=url

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-29
      • 2019-11-27
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      相关资源
      最近更新 更多