Есть анонимный сервис с post и с другого локалхоста не получается достучаться без OPTIONS ендпоинта который заполнит нужные хедеры. Если уже делать этот OPTIONS эндпоинт, то хотелось бы не для каждого уровня с UriTemplate = "/{s}", а что-то типа UriTemplate = "*", но с "*" - не работает.



Вопрос как сделать что-бы матчило по всем входящим юрлам любой вложености(/) или как сделать что бы CORS не вываливался по другому. 



Сейчас для каждого уровня пишется костыль типа:

 

        [OperationContract]

        [WebInvoke(Method = "OPTIONS", UriTemplate = "/{s}")]

        public void GetOptions(string s) {

            var outgoingResponseHeaders = HttpContextAccessor.GetInstance().Response.Headers;

            outgoingResponseHeaders["Access-Control-Allow-Origin"] = "*";

            outgoingResponseHeaders["Access-Control-Allow-Methods"] = "GET, POST, OPTIONS";

            outgoingResponseHeaders["Access-Control-Allow-Headers"] = "Origin, Content-Type, Accept, X-Requested-With, X-Requested-With, x-request-source";

            outgoingResponseHeaders["Access-Control-Request-Headers"] = "X-Requested-With, x-request-source, accept, content-type";

        }

Делалось по гайду тут, но не сработало так как надо. 

 

Нравится

2 комментария

Если есть такой вариант, то можно отключить проверку CORS, а именно:

 

1) В Web.config лоадера (внешний Web.config) заменить <add origin="*" allowed="false"/> на <add origin="*" allowed="true"/> 

2) В web.config лоадера заменить <cors enabled="true"> на <cors enabled="false">

 

После этого можно попробовать выполнить запрос еще раз.

Oleg Drobina,

спасибо, но у меня .net core.

Показать все комментарии

Добрый день!

Нужно выполнить авторизацию из стороннего приложения, но этому препятствует технология CORS. Каким образом можно ее обойти?

Возникают такие ошибки:

Изображение удалено.

Нравится

5 комментариев

Нужно в IIS разрешить доступ с другого домена, как описано тут.

 

 

Добавил раздел CORS в секцию <system.webServer> файла web.config сайта как описано в инструкции, после чего сайт перестал работать - выходит ошибка сервера:

Кто нибудь сталкивался с этим? Как решить эту проблему?

 

Видимо, неправильно дописали в файл. В таком случае верните обратно из резервной копии.

Вернул. Сделал как описано тут. Но ошибка осталась или поменялась, вот такая выходит:

policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Такое сообщение и его причины обсуждаются тут.

Показать все комментарии

Есть ситуации, когда нужно, чтобы при открытии карточки редактирования, в поля карточки подгружалась информация, которую нужно выводить в актуальном (обновленном) состоянии. К примеру, когда клиент звонит в тех поддержку, сотрудник техподдержки открывает карточку клиента в bpm'online и должен видеть текущий баланс данного клиента.
Предположим, есть WCF сервис, работающий на некотором хостинге, созданный для интеграции с биллинговой системой, с методом получения баланса абонента GetBalance, ответ от которого приходит в виде строки в формате JSON, который мы можем обработать и вывести в нужном формате на страницу редактирования.
Если выполнять запрос из бизнес процесса карточки редактирования (на PageLoadComplete, к примеру), то при выполнении запроса возникает зависание карточки редактирования, и она не отвиснет пока либо не придет ответ, либо пока запрос не будет завершен по таймауту (если сервер долго не отвечает).
Чтобы выполнить запрос асинхронно, нужно добавить на страницу редактирования JavaScript код, который будет обращаться к сервису, получать ответ от него и выводить результат в контролы страницы. Чтобы отправлять запрос сразу после загрузки страницы, нужно добавить элемент бизнес процесса «Задание-сценарий» на событие «PageLoadComplete», либо если нужно отправлять запрос по нажатию на кнопку, то на событие нажатия на неё.

StringBuilder sb = new StringBuilder();
sb.Append("var request = new XMLHttpRequest();");
sb.Append("var url = 'http://someserveradress/SomeWCFService.svc/GetBalance';");
sb.Append(
"request.open('GET',url,true);" +
"request.onreadystatechange = function() " +
"{  if (request.readyState == 4 && request.status == 200) {" +
Page.BalanceEdit.ClientID + ".setValue(request.responseText); } }; ");
sb.Append("request.send();");
Page.AddScript(sb.ToString());

При выполнении данного кода Java Script кода на странице, мы получим ошибку в консоли браузера:
XMLHttpRequest cannot load http://someserveradress/SomeWCFService.svc/GetBalance. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access.
Ошибка говорит о том, что запрещено обращаться к другому домену (попытка выполнить кросс-доменный запрос). Данное ограничение введено из соображений безопасности, но его можно обойти используя технологию CORS.
Подробную информацию об этой технологии можно посмотреть тут:
1) https://ru.wikipedia.org/wiki/Cross-origin_resource_sharing
2) http://enable-cors.org/
3) http://habrahabr.ru/post/120917/
Для того, чтобы разрешить кросс-доменные запросу, нужно включить поддержку на сервере, к которому приходит запрос, в моём случае это WCF служба. Для включения поддержки CORS у WCF сервиса, нужно выполнить действия, описанные тут: http://enable-cors.org/server_wcf.html.
Информацию по включению поддержки CORS для других платформ/серверов можно найти тут: http://enable-cors.org/server.html.
После этого, запрос должен выполняться асинхронно, не вызывая зависание карточки, благодаря чему можно просматривать/редактировать карточку в момент выполнения запроса.

Нравится

Поделиться

0 комментариев
Показать все комментарии