RedirectToRoute («по умолчанию») и Redirect (returnUrl) возвращают «200» вместо «302» - PullRequest
1 голос
/ 01 марта 2010

Я пытаюсь использовать следующий код для входа в систему:

$("form").submit(function(event)
{
    $.ajax({
        type: "POST",
        url: $(this).attr("action"),
        data: $(this).serialize(),
        complete: function(XMLHttpRequest, textStatus)
        {
            if (XMLHttpRequest.status === 302)
            {
                // if they've successfully logged in, I redirect to their page
                window.location = XMLHttpRequest.getResponseHeader("Location");
            }
        }
    });

    return false;
});

со следующим кодом на сервере для обработки сообщения:

[AcceptVerbs(HttpVerbs.Post)]
public  ActionResult LogOn(MyUser user)
{
    if (ValidateLogOn(user.UserName, user.Password))
    {
        if (Request.QueryString["ReturnUrl"] != null)
        {
            return Redirect(Request.QueryString["ReturnUrl"]);
        }
        else
        {
            return RedirectToRoute("Default");
        }
    }
}

Я думал, что оба результата действия «Перенаправить» должны были выдавать 302, но значение XMLHttpRequest.status всегда равно 200. Есть ли что-то, что я делаю неправильно?

РЕДАКТИРОВАТЬ: Это то, что в конечном итоге сработало

$("form").submit(function(event)
{
    $.ajax({
        type: "POST",
        url: $(this).attr("action"),
        data: $(this).serialize(),
        complete: function(xhr, textStatus)
        {
            var dataType = xhr.getResponseHeader("Content-Type");

            if (dataType.indexOf("json") > -1)
            {
                window.location = JSON.parse(xhr.responseText).returnUrl;
            }

            if (dataType.indexOf("html") > -1)
            {
                $('#main').html(xhr.responseText);
            }
        }
    });            
    return false;
});    

со следующим на сервере:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult LogOn(MyUser user, string returnUrl)
{
    if (!ValidateLogOn(user.UserName, user.Password))
    {
        return PartialView();
    }
    else
    {
        user = (MyUser)Session["CurrentUser"];
        if (user.IsPublic)
        {
            return Json(new { returnUrl = Url.RouteUrl("PublicRoute") });
        }
        else
        {
            if (!string.IsNullOrEmpty(returnUrl))
            {
                return Json(new { returnUrl = returnUrl.ToLower() });
            }
            else
            {
                return Json(new { returnUrl = Url.RouteUrl("AdminRoute") });
            }
        }
    }
}

Спасибо

Dave

1 Ответ

1 голос
/ 01 марта 2010

Ваш браузер автоматически следует за перенаправлением и запрашивает страницу перенаправления, которая затем возвращает 200.Запустите прокси-сервер (например, Fiddler или Charles), чтобы понять, что я имею в виду.

Я бы рекомендовал возвращать статус 200, но используйте объект JSON, чтобы указать, что вы хотите перенаправить пользователя.

Кроме того, этот ответ рекомендует использовать в этом сценарии статус 278 (очевидно, неиспользуемый код состояния, который звучит опасно для меня).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...