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 (т. Е. Пользователи проходят проверку подлинности по протоколу LDAP). Однако недавно мне пришлось перенести сайт на сервер, который использует RSA (двухфакторная аутентификация, пин-код и токен-код) для аутентификации пользователей, чтобы получить доступ к сайту. И теперь я вижу, что все мои сообщения jQuery возвращают "ошибка 405".

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

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

РЕДАКТИРОВАТЬ:

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

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

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

РЕДАКТИРОВАТЬ:

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

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

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

5 ответов

Решение

Основываясь на этом:

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

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

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

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

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

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

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

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

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

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

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

Обновить

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам