Сообщение CORS с предполетным запросом

Я пытаюсь загрузить файлы в службу в другом домене, используя CORS, но они продолжают отказывать из-за отказа источника. Насколько я вижу, для этого используются правильные заголовки.

Запрос Javascript:

  var xhr = new XMLHttpRequest();
  xhr.open('POST', "https://files.example.com", true);                                                                                                                            
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.onreadystatechange = function () {
    if (this.status == 200 && this.readyState == 4) {
      console.log('response: ' + this.responseText);
    }
  };

  xhr.send();

Ответ на предварительный запрос OPTIONS:

Access-Control-Allow-Headers:Origin, Authorization, Content-Type
Access-Control-Allow-Methods:POST, OPTIONS
Access-Control-Allow-Origin:*
Content-Length:0
Content-Type:application/json
Date:Mon, 19 Nov 2012 23:30:21 GMT

Заголовки для POST-запроса:

Cache-Control:no-cache
Content-Type:application/json
Origin:https://www.example.com
Pragma:no-cache
Referer:https://www.example.com
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.19 (KHTML, like     Gecko) Chrome/25.0.1325.0 Safari/537.19

Что приводит к ошибке:

XMLHttpRequest cannot load https://files.example.com. Origin https://www.example.com is not allowed by Access-Control-Allow-Origin.
 P Srinivas Goud27 февр. 2013 г., 06:14
У вас есть решение для этого, я также сталкиваюсь с подобной проблемойstackoverflow.com/questions/15094620/...
 maxbeatty01 апр. 2013 г., 21:47
Этот запрос подтвержден? Если это так, Access-Control-Allow-Origin должен соответствовать Origin (нельзя использовать подстановочный знак).

Ответы на вопрос(4)

то субдомен, протокол и порт должны быть идентичны в Origin и Access-Control-Allow-Origin.

В вашем примере это выглядит так:https://www.example.com и Access-Control-Allow-Origin:https://files.example.com

 Oooogi05 янв. 2016 г., 14:51
Но он использовал Access-Control-Allow-Origin: *, который поддерживает все источники

вков в предварительной проверке. Полный заголовок должен выглядеть так:

Access-Control-Allow-Headers: Cache-Control, Pragma, Origin, Authorization, Content-Type

но, глядя на вашу информацию, видно, что проверка CORS перед полетом работает нормально, это всего лишь фактический (2-й) запрос CORS, когда ответ блокируется браузером.

Жаль, что вы не включили ответ для фактического (2-го) запроса CORS, потому что он мог содержать ключ к отклонению ответа. Я подозреваю, что хотя предполетный ответ правильно содержит заголовок:

Access-Control-Allow-Origin:*

... ваш фактический (2-й) ответ может не содержать этот заголовок, и в этом случае браузер корректно отклоняет ответ. Если мое предположение верно, решение будет состоять в том, чтобы просто включить этот заголовок также в фактический (не перед полетом) ответ.

размещение на домене, отличном от вашей страницы, вызывает CORS. Это также включает в себя различные субдомены, порты и протокол (http / https).

Предварительная проверка выполняется, когда запрос «не простой», то есть заголовок типа содержимого установлен в нечто отличное от «text / plain». Ваше "application / json" заставляет браузеры бояться предварительной проверки.

Если эти 50-200 мс важны для вас, вы можете переписать свой веб-сервис, чтобы понять «простой» тип контента. Если нет, то вы должны заставить свой веб-сервис возвращать HTTP-статус 204 (без содержимого), когда для него заданы OPTIONS (метод http).

При работе с wcf:

WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.NoContent;

Ваш ответ на вопрос