спасибо всем за ваше время и усилия, пытаясь помочь мне решить эту проблему.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;
}
}
}