0

спасибо всем за ваше время и усилия, пытаясь помочь мне решить эту проблему.Angular SPA не может открыть удаленный отчет SSRS

Теперь давайте доберемся до него ... У меня есть AngularJS SPA. Я хотел бы предоставить ссылки на моей странице просмотра, чтобы при нажатии этой кнопки откройте новую вкладку и запустите уже существующие отчеты SSRS в формате PDF. Технически то, что я пытаюсь сделать: Render SSRS report в моем репозитории, передайте это через мой WEB API, а затем в мой SPA для отображения на новой вкладке.

Важное замечание перед тем, как идти дальше: эта настройка, метод и подход работают безупречно на моей локальной машине в Visual Studio. Это когда я перемещаю свой SPA на удаленный веб-сервер (тот же сервер, на котором размещаются SSRS), что у меня проблема.

Мой пейзаж:

Local Machine Development (Windows 7 Pro, VS2015 Pro)
Сервер1 (Win сервер 2012R2): Хосты IIS (8), SPA, SQL (2014) и SSRS
Сервер2 (Win Server 2012R2). Hosts SSRS (SQL 2012) источник данных (бывает, это кубы SSAS, но я не думаю, что это важно).

На моей машине местного развития:

Как указывалось выше решение прекрасно работает через Visual Studio. Единственной частью решения на моей локальной машине является SPA. Часть SSRS и SQL расположена удаленно. Я могу запустить свой SPA, щелкнуть ссылку и открыть новую вкладку, содержащую отчет PDF. Я также могу сделать вызов непосредственно на веб-API и отобразить отчет в формате PDF (http://localhost:3040/api/dataservice/ProductivityReportH/)

Проблема 1

просмотра в развернутом версии моего SPA на Server1, то приложение отображает отлично. Но, если я нажимаю на гиперссылку отчета, я получаю следующее сообщение:

Вы хотите открыть или сохранить ProductivityReportH/(3.28KB) у Server1?

Независимо от того, что я нажимаю (Open, Save, Cancel), ничего не происходит.

Если я попытаюсь запустить отчет напрямую через API, я получаю то же сообщение. В окне консоли отсутствуют ошибки. Я не могу найти ошибок в файлах журнала Server1.

On Server1: Я могу отображать отчет через средство просмотра отчетов SSRS.

Задача 1A

Использование браузера на Server1, я могу показать приложение просто отлично. Но, если я нажимаю на гиперссылку отчета, я получаю то же сообщение, что и проблема 1. Если я попытаюсь запустить отчет непосредственно через веб-API (http://Server1/projecttracker/api/dataservice/ProductivityReportH/) на Server1, я получаю то же сообщение.

Любые идеи будут высоко оценили

My SPA Установка:

Просмотр Страница:

<div class="view indent"> 
<div class="container"> 
    <h2>Productivity Reports Method 1</h2> 
    <a ng-href='#here' ng-click="hproductivityreport()">Launch</a><br> 
</div> 

Мой контроллер:

(function() { 
var ProjectsController = function ($scope, $window) { 
    $scope.hproductivityreport = function() { 
     $window.open('api/dataservice/ProductivityReportH/', '_blank'); 
    }; 

} 
ProjectsController.$inject = ['$scope', '$window']; 
angular.module('ReportTracker').controller('ProjectsController', ProjectsController) 
}()); 

WEB-API:

using ProjectTracker.Repository; 
using System.IO; 
using System.Net; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using System.Web; 
using System.Web.Http; 

namespace ProjectTracker.Model 
{ 
    [Authorize] 
    public class DataServiceController : ApiController 
    { 
     IProjectTracker _ProjectTrackerRepository; 
     public DataServiceController() 
     : this(null) 
     { 
     } 
     public DataServiceController(IProjectTracker Repo) 
     { 
      _ProjectTrackerRepository = Repo ?? new ProjectTrackerRepository (); 
    } 
     [HttpGet] 
     public HttpResponseMessage ProductivityReportH() 
     { 
      var result = new HttpResponseMessage(HttpStatusCode.OK); 
      byte[] bytes = _ProjectTrackerRepository.RenderProductivityReport("Hibble, Norman"); 
      Stream stream = new MemoryStream(bytes); 
      result.Content = new StreamContent(stream); 
      result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); 
      return result; 
     } 
    } 
} 

Respository:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Data; 

namespace ProjectTracker.Repository 
{ 
    public class ProjectTrackerRepository : RepositoryBase<ProjectTrackerContext>, IProjectTracker 
    { 
     ProjectTrackerContext _Context; 
     public ProjectTrackerRepository() 
     { 
      _Context = new ProjectTrackerContext(); 
     } 

     public Byte[] RenderProductivityReport(string _sManager) 
     { 
      Server1.ReportExecutionService rs = new Server1.ReportExecutionService(); 
      rs.Credentials = System.Net.CredentialCache.DefaultCredentials; 
      rs.Url = "http://Server1/reportserver/ReportExecution2005.asmx"; 

      // Render arguments 
      byte[] result = null; 
      string reportPath = "/Staff Client Services/StaffProductivity"; 
      string format = "PDF"; 
      string historyID = null; 
      string devInfo = @"<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>"; 
      //Create the list of parameters that will be passed to the report 
      List<Server1.ParameterValue> lstParameterValues = new List<Server1.ParameterValue>(); 

      Server1.ParameterValue aParameter = new Server1.ParameterValue(); 
      aParameter.Name = "SupervisorSupervisorName"; 
      aParameter.Value = "[Supervisor].[Supervisor Name].&[" + _sManager + "]"; 
      lstParameterValues.Add(aParameter); 

      Server1.ParameterValue bParameter = new Server1.ParameterValue(); 
      bParameter.Name = "PayPeriodPayPeriodYear"; 
      bParameter.Value = "[Pay Period].[Pay Period Year].&[2015]"; 
      lstParameterValues.Add(bParameter); 

      int index = 0; 
      Server1.ParameterValue[] parameterValues = new Server1.ParameterValue[lstParameterValues.Count]; 
      foreach (Server1.ParameterValue parameterValue in lstParameterValues) 
      { 
       parameterValues[index] = parameterValue; 
       index++; 
      } 

      string encoding; 
      string mimeType; 
      string extension; 
      Server1.Warning[] warnings = null; 
      string[] streamIDs = null; 

      Server1.ExecutionInfo execInfo = new Server1.ExecutionInfo(); 
      Server1.ExecutionHeader execHeader = new Server1.ExecutionHeader(); 
      rs.ExecutionHeaderValue = execHeader; 
      execInfo = rs.LoadReport(reportPath, historyID); 

      rs.SetExecutionParameters(parameterValues, "en-us"); 
      String SessionId = rs.ExecutionHeaderValue.ExecutionID; 

      try 
      { 
       result = rs.Render(format, devInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs); 
       execInfo = rs.GetExecutionInfo(); 
      } 
      catch (Exception e) 
      { 
       Exception Errr = e.InnerException; 
      } 

      return result; 
     } 
    } 
} 

ответ

0

Наконец! Для тех, кто заинтересован ...

Обнаружили это почти два года назад.

AppPool Permission Issue with Accessing Report Server

В частности, комментарий ниже:

Почти такая же ситуация здесь кроме IIS и сервера отчетов, работающих на Windows Server 2008 R2. Раньше я использовал приложение asp.net с его собственным пулом приложений, и все работало. Когда я изменил приложение на DefaultAppPool (из-за другой проблемы), я получил проблему с разрешениями. Я изменил Identity DefaultAppPool с ApplicationPoolIdentity на LocalSystem (в IIS, Дополнительные настройки), и он снова работал.

Измененный пул приложений по умолчанию для веб-сервера в LocalSystem и wha-la, я предоставляю отчеты PDF из куба SSAS через мой AngularJS SPA.

Смежные вопросы