【发布时间】:2016-04-11 05:38:32
【问题描述】:
感谢大家为帮助我解决这个问题所付出的时间和努力。
现在让我们开始吧...我有一个 AngularJS SPA。我想在我的视图页面上提供链接,单击该链接时,会打开一个新选项卡并以 PDF 格式启动预先存在的 SSRS 报告。从技术上讲,我正在尝试做的事情:在我的存储库中呈现 SSRS 报告,通过我的 WEB API 将其传递到我的 SPA 以在新选项卡中显示。
在我继续之前有一个重要说明:此设置、方法和方法在我的本地计算机上的 Visual Studio 中完美运行。当我将我的 SPA 移动到远程 Web 服务器(托管 SSRS 的同一服务器)时,我遇到了问题。
我的风景:
本地开发机(Windows 7 Pro、VS2015 Pro)
Server1 (Win Server 2012R2):托管 IIS (8)、SPA、SQL (2014) 和 SSRS
服务器 2(赢服务器 2012R2)。托管 SSRS (SQL 2012) 数据源(可能是 SSAS 多维数据集,但我认为这并不重要)。
在我的本地开发机器上:
如上所述,该解决方案可通过 Visual Studio 正常工作。我本地机器上解决方案的唯一部分是 SPA。 SSRS 和 SQL 部分位于远程。我可以启动我的 SPA,单击链接并打开包含 PDF 报告的新选项卡。我还可以直接调用 Web API 并显示 PDF 报告 (http://localhost:3040/api/dataservice/ProductivityReportH/)
问题 1
浏览到我在 Server1 上部署的 SPA 版本,应用程序显示正常。但是,如果我单击报告超链接,我会收到以下消息:
您要从 Server1 打开还是保存 ProductivityReportH/ (3.28KB)?
无论我单击什么(打开、保存、取消),都没有任何反应。
如果我尝试直接通过 API 启动报告,我会收到相同的消息。控制台窗口中不显示任何错误。我在 Server1 日志文件中找不到任何错误。
在 Server1 上:我可以通过 SSRS 报告查看器显示报告。
问题 1A
使用 Server1 上的浏览器,我可以很好地显示应用程序。但是,如果我单击报告超链接,我会收到与问题 1 相同的消息。如果我尝试直接通过 Web API (http://Server1/projecttracker/api/dataservice/ProductivityReportH/) 启动报告 在 Server1 上,我收到相同的消息。
任何想法将不胜感激
我的 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;
}
}
}
存储库:
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;
}
}
}
【问题讨论】:
标签: asp.net sql-server angularjs asp.net-web-api reporting-services