У меня есть набор веб-служб WCF, работающих только на внутреннем интерфейсе, которые вызываются рядом других веб-сайтов (также только внутренних). Имена доменов совпадают, это просто другой номер порта.
Я делаю запросы AJAX POST к этим веб-службам, и, поскольку они технически не одного происхождения (другой порт), я использую CORS.
В IE все в порядке (поскольку я считаю, что IE не рассматривает порты как разные источники), однако и Opera, и Firefox отправляют предварительный запрос OPTIONS.
Я настроил веб-службы для приема этих запросов через файл web.config:
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS" />
<add name="Access-Control-Allow-Headers" value="*" />
Я также настроил интерфейс своих сервисов на прием любого HTTP-глагола:
[OperationContract(Name = "H2dbDataExport")]
[WebInvoke(Method = "*", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
string H2dbDataExport(string action, string username, exportDetails data);
Однако это приводит к вызову базовой службы, и поскольку она не находит никаких деталей, которые можно было бы ожидать в ответах на запрос POST со стандартным ответом «Вы отправили что-то не так».
Если я изменю службу, чтобы принимать только запрос POST - это действительно единственный ответ, на который он ответит чем-либо таким же через:
[WebInvoke(Method = "POST", etc.......
Затем ВАРИАНТЫ предварительной проверки получают ответ «405 - метод не разрешен».
Что я делаю не так? Должен ли я настраивать свои службы для ответа на запрос OPTIONS, и если да, то каким будет правильный ответ?
Я предполагаю, что я мог бы просто выбрать тип запроса в службе и ответить 200 - ОК, если глагол был ВАРИАНТЫ, то повторно отправить фактический POST - но если я сделал это вручную, наверняка браузер просто отправит ВАРИАНТЫ снова как это новый запрос.
РЕДАКТИРОВАТЬ:
Я только что нашел этот пост, касающийся удаления обработчика WEbDAV: CORS 405 (метод не разрешен )а>
Но это не помогло.
Также был пост о перемещении обработчика OPTIONSHttpVerb в начало списка и предоставлении ему разрешений «Чтение», но это также не помогло.
РЕДАКТИРОВАТЬ 2: На самом деле перемещение OPTIONSHttpVerb действительно помогло, оно больше не вызывает веб-службу, но IIS отвечает 200 - OK. Однако этот ответ по-прежнему попадает в клиентский код в браузере, поэтому бесполезен.
ВАРИАНТЫ ответа
HTTP/1.1 200 OK
Allow: OPTIONS, TRACE, GET, HEAD, POST
Server: Microsoft-IIS/7.5
Public: OPTIONS, TRACE, GET, HEAD, POST
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Date: Fri, 05 Jun 2015 10:34:29 GMT
Content-Length: 0