AJAX Call возвращает 404 (локальный) в IIS 7.5, но тот же работает в других IIS

Имея вызовы AJAX для моего контроллера в моем приложении MVC

Controller/FunctionName



$.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        url: '/Controller/FunctionName',
        .
        .
        .
        )};

Используем MVC 4 и используем функцию JQUERY Ajax, как показано в приведенном выше коде. Он отлично работает, когда я запускаю Visual Studio.

Я деполировал это на серверную машину и, как ожидалось, отлично работает. В вызовах AJAX не обнаружено проблем.

Теперь я пытаюсь развернуть это на своем локальном компьютере IIS, который совпадает с моей версией сервера (IIS 7.5), но я получаю 404 для всех вызовов ajax в firebug.

Я проверил сборку и даже указал на мою веб-папку и все еще ищу, что пошло не так.

Он работает в других IIS, поэтому это не проблема с разрешением URL-адреса. Мне не хватает каких-либо настроек или любая своевременная идея исправить это было бы здорово.

Спасибо

Ответ 1

Это нормально. У вас жестко закодирован URL-адрес действия вашего контроллера:

url: '/Controller/FunctionName',

Если вы развертываете свое приложение в виртуальном каталоге в IIS, правильным URL-адресом должно быть:

url: '/YourAppName/Controller/FunctionName',

Это причина, по которой вы никогда не должны жестко указывать URL-адреса в приложении ASP.NET MVC, но ВСЕГДА используйте помощники URL для его создания:

url: '@Url.Action("FunctionName", "Controller")',

и если этот вызов AJAX находится в отдельном файле javascript, где вы не можете использовать серверные помощники, вы можете прочитать этот URL-адрес от какого-либо элемента DOM, который вы AJAXifying.

Например, предположим, что у вас был якорь:

@Html.ActionLink("click me", "FunctionName", "Controller", null, new { id = "myLink" })

что вы AJAXify:

$('#myLink').click(function() {
    $.ajax({
        url: this.href,
        contentType: 'application/json; charset=utf-8',
        type: 'GET',
        .
        .
        .
    )};    
    return false;
});

Обратите внимание, как мы читаем URL-адрес из элемента DOM, который был создан помощником.

Заключение и 2 эмпирических правила:

  • НИКОГДА НИКОГДА код жесткого кода в приложении ASP.NET MVC
  • АБСОЛЮТНО ВСЕГДА используйте помощники URL-адресов при работе с URL-адресами в приложении ASP.NET MVC.

Ответ 2

То, что я нашел в моей настройке IIS7.5, состоит в том, что "Картография обработчика" имеет ресурс с именем "OPTIONSVerbHandler" , который не задан в правильном порядке, поэтому возвращается обратно как Неизвестный.

Эта работа для меня, где мой localhost ajax вызывал мой сетевой сервер, который имеет другое имя, что он не должен давать мне проблему CORS, но это было так, и это было моим решением.

Откройте IIS и щелкните имя своего сервера на левой панели. На правой панели дважды щелкните мышью "Обработчики" в средней панели. На правой панели выберите "Просмотреть упорядоченный список". Оттуда найдите "OPTIONSVerbHandler" и "svc-ISAPI-4.0_32bit", переместите "OPTIONSVerbHandler" вверх, пока он не окажется выше "svc-ISAPI-4.0_32bit".

Убедитесь, что ваш "обработчик" внутри вашего вызова ajax не имеет в нем "Access-Control-Allow-Origin".

Ответ 3

Просто дополнение Дарин отвечает, что если "вызов AJAX находится в отдельном файле javascript, где вы не можете использовать помощники на стороне сервера", используйте скрытое поле для хранения конечная точка URL в представлении:

@Html.Hidden("URLEndpointName", Url.Action("FunctionName", "Controller"))

и прочитайте это скрытое поле в js:

url: $("#URLEndpointName").val(),