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

Запрос кросс-домена Chrome не работает

У меня есть сайт с REST Api, и теперь я создаю расширение для браузера, которое будет собирать данные с некоторых страниц и отправлять их обратно в REST Api. Поскольку я хочу, чтобы мое расширение было совместимо с firefox и chrome, и чтобы быть легко поддерживаемым, я вставляю фактический код на страницу в качестве тега script, который затем выполняется как обычный javascript. В настоящее время я работаю только с хромированной версией расширения, и я столкнулся с проблемой:

Когда я пытаюсь отправить свои данные в api (запрос PATCH), хром не позволит мне сказать:

XMLHttpRequest не может загрузить http://my.rest/api. Происхождение http://website.com не разрешено Access-Control-Allow-Origin.

У меня есть Access-Control-Allow-Headers, Methods и Origin, все настроены на правильные значения, но он все еще не работает. Однако он работает с запросами GET. Я также пробовал запрос POST и PUT, но они тоже не работают.

Вот мои заголовки:

Запрос:

OPTIONS /some/api/path HTTP/1.1
Host: my.rest
Connection: keep-alive
Access-Control-Request-Method: PATCH
Origin: http://website.com
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36
X-FireLogger: 1.1
Access-Control-Request-Headers: accept, x-http-auth-user, x-http-auth-token, origin, content-type
Accept: */*
Referer: http://website.com/index.php
Accept-Encoding: gzip,deflate,sdch
Accept-Language: cs-CZ,cs;q=0.8

Ответ:

Access-Control-Allow-Headers:accept, x-http-auth-user, x-http-auth-token, origin, content-type
Access-Control-Allow-Methods:PATCH
Access-Control-Allow-Origin:*
Connection:Keep-Alive
Content-Type:text/html; charset=utf-8
Date:Thu, 04 Jul 2013 10:50:08 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.2 (Win64) PHP/5.4.3
X-Frame-Options:SAMEORIGIN
X-Powered-By:Nette Framework

Я также попытался настроить Access-Control-Allow-Origin на то же значение, что и заголовок Origin, но он не работал. Furthemore, похоже, работает в Firefox. У меня Chrome 27, который должен быть обновлен.

4b9b3361

Ответ 1

Я сталкиваюсь с аналогичной проблемой в node.js с cors

Вам нужно установить "Access-Control-Allow-Origin" в конкретный домен, а не подстановочный знак

Пример: 'Access-Control-Allow-Origin' to 'http://website.com'

(Вы можете иметь на своем сервере разрешенный массив истоков и проверять его, если он разрешен, а затем отвечать на него вместо подстановочных знаков)

Также вы можете настроить заголовки "Access-Control-Allow-Methods" на список таких параметров, как:

'POST, GET, OPTIONS, DELETE, PUT'

Ответ 2

вы должны разрешить OPTIONS в заголовке ответа.

"Access-Control-Allow-Methods", "GET, POST, HEAD, OPTIONS, PUT, DELETE"

Ответ 3

Я попробовал CORS на Chrome 27.0.1453.116, и это сработало для меня. С клиентской стороны все, что я сделал, находится в jquery AJAX, установите " crossDomain" в true.

$.ajax('http://localhost/Elements.Services/Elements.svc/REST/Element/Get?ID=1', {
                    type: 'GET',
                    crossDomain: true,
                    success: function (data) {
                      alert(data);
                    }
                });

В то время как на стороне службы REST для каждого запроса установлены следующие заголовки ответов:

  • ( "Access-Control-Allow-Headers", "Accept" ) или ( "Access-Control-Allow-Headers", HTTPRequest.RequestedHeaders + "Accept" )

  • ( "Access-Control-Allow-Methods", "POST, PUT, GET" )

  • ( "Access-Control-Allow-Origin", "*" )

Здесь - отличная статья о работе CORS, которая действительно помогла мне.

Ответ 4

В вашем WebApi:

Добавить пакет Microsoft.AspNet.WebApi.Cors NuGet в проект

Убедитесь, что вы также зарегистрируете поддержку CORS или глобально, на контроллере или в действии.

Глобальный - В файле WebApiConfig.cs из папки App_Start добавьте:

public static void Register(HttpConfiguration config) {

// New code: var cors = new EnableCorsAttribute( origins: "*", headers: "*", methods: "*"); config.EnableCors(cors);

// Other configurations

}

Контроллер или Действие - При необходимости/требуется разместить поддержку на этих уровнях (это приведет к перезаписи глобальных настроек - Action > Controller > Config). Над сигналом контроллера или действия:

[EnableCors(origins: "http://localhost:[*port #*]", headers: "*", methods: "*")]

Примечание: * являются "подстановочными знаками", возможно, захотите, чтобы домен сделал запрос ex: (http://localhost:[ port #])

Что-то, что очень легко пропустить/забыть...

В проводнике решений, щелкните правой кнопкой мыши api-project. В окне свойств установите "Анонимная аутентификация" на "Включено".

Ответ 5

почему бы просто не использовать PUT вместо PATCH и ваш тип запроса. Они в значительной степени делают то же самое