Проблема перекрестного происхождения с отчетом SSRS

Я пытаюсь внедрить отчет ssrs в свое приложение Angular. Вот некоторый код: Шаблон:

<div panel-charts style="width:100%:height:100%"                         
</div>

Директива:

a.directive('panelCharts', function () {
return {
    link: function (scope, elem, attrs) {
         $(elem).load('http://localhost/Reportserver?/casechart&Title=abc');
    }
   }
});

Корень моего приложения — localhost: 7063.

Я получаю следующее: XMLHttpRequest не может загрузить http://localhost/Reportserver?/casechart&Title=abc. В запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Таким образом, доступ к источнику 'http://localhost:7063' запрещен. В ответе был код состояния HTTP 401.

Я понимаю, что моя проблема связана с CORS. Я добавил это в свой web.config:

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
  </customHeaders>
</httpProtocol>

Это не помогло. Но у меня есть кнопка, которая запускает следующее, когда я нажимаю на нее:

<button type="button" style="width:auto;" ng-click="runReport()">
      Test
</button>

А это в контроллере:

$scope.runReport = function () {
 var win = window.open('http://localhost/Reportserver?/casechart&Title=abc', '_blank');
}

тогда это работает.

Любая идея, как заставить его работать, не нажимая на кнопку?

Спасибо

Изменить 1. Запрос:

Request      URL:http://localhost/Reportserver?/casechart&Title=abc
Request Method:GET
Status Code:401 Unauthorized
Remote Address:10.229.232.73:80

заголовок запроса:

Accept:text/html, */*; q=0.01
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Host:localhost
Origin:http://localhost:7063
Referer:http://localhost:7063/Main.aspx
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,     like Gecko) Chrome/48.0.2564.109 Safari/537.36

person Mark    schedule 27.02.2016    source источник


Ответы (2)


Из документов jQuery

Из-за ограничений безопасности браузера большинство запросов «Ajax» подчиняются одной и той же политике происхождения; запрос не может успешно получить данные из другого домена, субдомена, порта или протокола.

Вам нужно добавить iframe в шаблон вместо использования метода .load jQuery, потому что файлы script и css, которые потребуются приложению отчета SSRS, не будут загружены в документ страницы.

element.append('<iframe src="http://localhost/Reportserver?/casechart&Title=abc" width="500px" height="500px"></iframe>')
person Pankaj Parkar    schedule 27.02.2016

Если вы просто хотите открыть отчет в новом окне, вы можете просто вызвать window.open в своей директиве:

a.directive('panelCharts', function () {
  return {
    link: function (scope, elem, attrs) {
      window.open('http://localhost/Reportserver?/casechart&Title=abc');
    }
  }
});

CORS применяется только для AJAX-запросов, таких как .load jQuery, которые выполняют запрос асинхронно на текущей странице.

Однако, если вы действительно хотите загрузить отчет через AJAX и отобразить его на текущей странице, установка заголовка Access-Control-Allow-Origin — правильный путь.

На заметку: по соображениям тестируемости предпочтительным способом доступа к глобальному объекту window является служба $window (см. документы).

person Christian Zosel    schedule 27.02.2016
comment
‹Настройка заголовка Access-Control-Allow-Origin — правильный путь. Но я пробовал, не помогло. Или я что-то упускаю? Я действительно хочу загрузить отчет в какой-то контейнер на моей странице. - person Mark; 27.02.2016
comment
этот код откроет указанный URL-адрес на текущей вкладке ... и это не то, чего хотел достичь OP. - person Pankaj Parkar; 27.02.2016
comment
Вы проверили в инструментах разработчика браузера, действительно ли заголовок присутствует? Вы можете найти объяснение настройки для разных серверов здесь: enable-cors.org/server.html - person Christian Zosel; 27.02.2016
comment
Ну, я не контролирую ответы. Это сервер отчетов SSRS, который возвращает отчет. - person Mark; 27.02.2016
comment
Ох, хорошо. Я не знаком с SSRS, но нашел это: stackoverflow .com/questions/32326892/ - person Christian Zosel; 27.02.2016
comment
@ChristianZosel Я пробовал это, и это не работает. - person Virender Thakur; 04.12.2020