Я изначально спросил это на переполнении стека, но сегодня утром мне пришло в голову, что этот вопрос лучше подходит для сбоя сервера ...
Я использую AJAX для выполнения запросов CORS к api, но вижу действительно странное поведение: мое отслеживание кликов (предварительный запрос OPTIONS) всегда прерывается IIS и возвращает 500, прежде чем запрос будет передан приложению.
Для сравнения, вот рядом сбойный запрос (слева) и успешный запрос (справа), как видно в инспекторе запросов Firefox (щелкните, чтобы увидеть полный размер) ...
Обратите внимание, что оба этих запроса являются автоматически сгенерированными предполетными запросами, созданными jQuery (1.8.3), обращающимися к одному и тому же серверу с той же страницы, с интервалом всего в несколько секунд. Множество других запросов работают нормально и продолжают нормально работать после неудачного запроса OPTIONS для /click
. Но каждый запрос на /click
не работает точно так же.
Предполетная подготовка к /click
не удается из-за отсутствия ACCESS-CONTROL-ALLOW-HEADERS
заголовок ответа; но если бы IIS разрешил приложению отвечать на запрос, оно было бы включено и ответило бы статусом 200 (точно так же, как тот, что справа) ...
Я не могу понять, зачем IIS это делает.
Я должен отметить, что API не всегда включает ACCESS-CONTROL-ALLOW-HEADERS
заголовок ответа. Я только недавно добавил это, так что возможно, мы смотрим на результат того, что что-то застряло где-то в кеше. Тем не менее, я пробовал и в Firefox, и в Chrome, и сделал «удалить все, что сохранил все до начала времени» в обоих, так что теоретически это не должно кэшироваться, верно?
Я также пробовал изменить URI на /click2
в целях тестирования, после исправление проблемы с заголовками, поэтому теоретически это не должно быть проблемой кеширования для этого URI, если это для другого. Однако проблема сохраняется и с этим новым URI.
Можно ли включить дополнительные журналы в IIS, чтобы выяснить, в чем проблема? Настройки я должен проверить? Какая-то известная проблема? Я в полной растерянности, здесь ...
Я вижу, что отказавший запрос - это запрос POST.
Настройте ACCESS-CONTROL-ALLOW-METHODS, чтобы включить POST.
Это должно решить вашу проблему