Подтвердить что ты не робот

Сообщение jQuery AJAX получает ошибку 405 (HTTP-сообщение не поддерживается POST)

У меня есть следующий пост jQuery для веб-метода ASP.NET:

$.ajax({
    type: "POST",
    url: "AjaxWebMethods.aspx/UpdNote",
    contentType: "application/json; charset=utf-8",
    data: "{'ID' : '" + id + "', 'note' : '" + note + "' }",
    dataType: "json",
    success: UpdNote_Success,
    error: AjaxError
});

И объявлен веб-метод:

[System.Web.Services.WebMethod(enableSession: true)]
public static int UpdNote(int ID, string note) {
    // business logic that eventually returns a number, but simplifying
    // ... for the sake of brevity
    int retNum = 99;

    return retNum;
}

Почта jQuery и веб-метод отлично работают в среде Windows Authenticated (т.е. пользователи аутентифицируются LDAP). Тем не менее, мне недавно пришлось переместить веб-сайт на сервер, который использует RSA (двухфакторная аутентификация, код PIN-кода и токена) для аутентификации пользователей, чтобы получить доступ к сайту. И теперь я вижу, что все мои сообщения jQuery возвращают "ошибку 405".

Кросс-сайтные запросы приходят на ум, очевидно, но ничто из этого не происходит здесь. Все сообщения jQuery AJAX используют веб-методы, объявленные в AjaxWebMethods.aspx, эта страница находится в собственном домене сайта.

Заранее благодарим за любую помощь или предложения!

EDIT:

Использование Fiddler в IE8 дает мне немного больше информации. Код ошибки, который он возвращает, по-прежнему равен 405, но ошибка сервера более описательна. Ошибка сервера: "HTTP-протокол POST, используемый для доступа к пути" /AjaxWebMethods.aspx/UpdNote "не разрешен."

Я попытался изменить параметр типа запроса ajax на GET, но вместо этого получаю 404 (ресурс не найден).

Кроме того, забыл упомянуть, что это связано с SSL (хотя я не ожидаю, что это изменит ситуацию).

EDIT:

После обширного тестирования (и обширной помощи проницательных членов stackoverflow) я решил, что ошибка 405 напрямую связана с пулом приложений, который используется веб-сайтом, а более конкретно - с режимом управляемого канала, который выбран для Пул приложений.

Если я использую пул приложений, который нацелен на v4.0 (.NET Framework) и Integrated (Managed Pipeline Mode), то мой пост AJAX работает отлично. Но если я использую пул приложений, который нацелен на v4.0 и классический (управляемый режим трубопровода), тогда я получаю ошибку 405.

Итак, на данный момент я все еще ищу решение этого вопроса, хотя мне удалось справиться с проблемой.

4b9b3361

Ответ 1

Исходя из этого:

Почта jQuery и веб-метод отлично работают в среде Windows Authenticated (т.е. пользователи аутентифицируются LDAP). Тем не менее, мне недавно пришлось переместить веб-сайт на сервер, который использует RSA (двухфакторная аутентификация, код PIN-кода и токена) для аутентификации пользователей, чтобы получить доступ к сайту. И теперь я вижу, что все мои сообщения jQuery возвращают "ошибку 405".

Понятно, что ошибка связана с конфигурацией сервера, но, если можно, создайте новый сайт на сервере RSA, и для этого сайта отключите аутентификацию RSA, попробуйте просмотреть свой сайт, чтобы быть абсолютно уверен, что ошибка связана только с аутентификацией RSA, отбрасывая отсутствующие компоненты/конфигурацию, связанные с кодом, на новом сервере

Как только вы отбросили проблемы с настройкой кода, я бы рекомендовал вам дважды проверить конфигурацию RSA (что может быть сложно). Однажды я работал в проекте с использованием безопасности RSA, чтобы реализовать SSO на серверах. (Single Sign On), я помню, что был установлен фильтр RSA ISAPI на уровне сервера, и этот фильтр отвечал за чтение/установку файлов cookie для проверки подлинности каждого запроса на сервере Active Directory,

Поскольку каждый запрос управлялся этим фильтром, и этот фильтр ISAPI находился в верхней части конвейера, каждый запрос должен был обрабатываться фильтром RSA ISAPI сначала для аутентификации

Итак, мое предложение заключается в двойной проверке конфигурации RSA, чтобы обнаружить, что что-то блокирует ваши сообщения AJAX

Я помню, что конфигурация RSA была похожа на черную магическую коробку, у нас не было достаточной документации и настройки, это была PITA. Я искренне надеюсь, что это не так в вашей организации.

Ответ 2

Код HTTP 405 - это код "Не разрешенный метод". Итак, у вас есть некорректная настройка в вашей новой архитектуре. Это, безусловно, неверная конфигурация сервера. Эта ошибка может быть связана с несколькими местами и без доступа к вашему серверу, для кого-то еще будет сложно сказать вам, что происходит. Но, может быть, я могу дать вам некоторые отправные точки...

Вы дважды проверили свой web.config? Это было бы общим местом для возникновения такой ошибки.

Вы проверили журналы IIS? Это также было бы очень хорошим местом для начала.

Что произойдет, если вы попытаетесь выполнить POST без установки contentType вашего запроса? Возможно, ваша страница не настроена на получение запросов JSON.

Вы пытались использовать Fiddler? Попробуйте отправить запрос POST от внешнего клиента.

Обновление

Еще несколько предложений:

Вы пытались отключить SSL? Я бы отключил его, чтобы убедиться, что проблема не связана с SSL.

Вы переписываете URL-адрес? Если это так, это может быть связано.

Вы можете успешно отправлять POST на любые URL-адреса? Возможно, у IIS отключена функция POST. Если да, вот статья, которая могла бы помочь вам включить его, а вот поток, которые также могут помочь.

Вы пытались добавить HttpPost в свой web.config? Что-то вроде этого:

<webServices>
   <protocols>
      <add name="HttpPost" />
   </protocols>
</webServices>

Ответ 3

Для устранения неполадок попробуйте изменить AJAX "POST" на AJAX "GET". У меня была небольшая проблема, связанная с перемещением страницы, на которой был обработан метод ajax из нашей среды dev, в нашу производственную среду.

Ответ 4

HTTP 405 - это ошибка сервера, а не ошибка кода, указывающая, что доступ к ресурсу (URL) осуществляется неверным методом. Попробуйте использовать GET вместо POST.

Ответ 5

Возможно, на вашем сервере не установлены расширения ajax. Попытайтесь пометить ссылки на CopyLoacal = true и развернуть папку bin на веб-сервере.