Позвольте мне сначала поместить сюда фрагменты кода. Я просто использую проект ASP.NET MVC, который Visual Studio создает из коробки. Поэтому я просто добавляю к нему отрывки:

Раздел Site.master head:

<head runat="server">
    <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
    <script src="../../Scripts/jquery-1.3.2.min.js" type="text/javascript"></script>
    <link href="../../Content/Site.css" rel="stylesheet" type="text/css" />
    <script src="../../Scripts/test.js" type="text/javascript"></script>
    <script type="text/javascript">$(document).ready(ready);</script>
</head>  

Содержание test.js:

function ready(){
 $.get("/Home/TestAjax", ajaxResponse);
}

function ajaxResponse(data){
    alert("got response from server: " + data);
}

Метод в HomeController:

        public String TestAjax()
        {
            if (Request.IsAjaxRequest())
            {
                return "Got ajax request!";
            }
            else
            {
                return "Non-ajax request";
            }
        }

Теперь проблема, которую я вижу в Firefox 3.5.30729 (Firebug), заключается в том, что когда запрос ajax уходит, IIS 7 на удаленном ящике отправляет Http 302 обратно, что выполняет перенаправление и вызывает другой запрос на получение, но это не асинхронно. Opera тоже не работает, поэтому я предполагаю, что это та же проблема. Однако приведенный выше код отлично работает в IE 8, Chrome и Safari.

На localhost все вышеперечисленные браузеры работают должным образом, включая Firefox и Opera - все они получают «Получен запрос ajax!» как ответ от сервера.

У кого-нибудь есть идеи, что здесь происходит и как это исправить? Я ищу реальное решение или хотя бы объяснение того, что происходит и почему.

1
codelove 11 Мар 2010 в 07:55
Вы пробовали использовать Fiddler / Wireshark, чтобы улучшить видимость запроса / ответа?
 – 
Pierreten
11 Мар 2010 в 07:57
@Pierreten: Я возился с этим, пока мы говорим. Если будут какие-то новые находки, я опубликую здесь.
 – 
codelove
11 Мар 2010 в 08:06

2 ответа

Лучший ответ

Так что игра со Fiddler помогла разобраться в этой проблеме. Вот что происходило:

URI в вызове $ .get заставлял его не находить метод действия, который я указал в своем вопросе, что сервер возвращал 302. Как только Firefox (и Opera) получили 302 от сервера, они оба попытались использовать "/ Home / TestAjax / "(с косой чертой в конце). Однако на этот раз в заголовке HTTP не было X-Request-With, установленного на «XMLHttpRequest». Итак, в TestAjax() метод действия Request.IsAjaxRequest() был ложным, поэтому я получил ответ «не-ajax-запрос».

С другой стороны, IE, Safari и Chrome работали по той причине, что в перенаправленном запросе у них все еще был X-Request-With, установленный на «XMLHttpRequest». Для меня до сих пор остается загадкой, почему этого не произошло в Firefox и Opera, но сейчас я не буду об этом беспокоиться.

Совершенно глупо с моей стороны упускать из виду конечную косую черту, но я понятия не имел, что она так важна!

1
codelove 13 Мар 2010 в 06:11