【问题标题】:Angular SPA cannot open remote SSRS reportAngular SPA 无法打开远程 SSRS 报告
【发布时间】: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


    【解决方案1】:

    终于!有兴趣的朋友...

    从近两年前发现的。

    AppPool Permission Issue with Accessing Report Server

    特别是下面的评论:

    这里的情况几乎相同,除了在 Windows Server 2008 R2 上运行的 IIS 和报表服务器。我曾经让 asp.net 应用程序使用它自己的应用程序池运行,并且一切正常。当我将应用程序更改为 DefaultAppPool 时(由于不同的问题),我遇到了权限问题。我将 DefaultAppPool 的标识从 ApplicationPoolIdentity 更改为 LocalSystem(在 IIS 中,高级设置中),它再次工作。

    将 Web 服务器默认应用程序池更改为 LocalSystem 和 wha-la,我正在通过我的 AngularJS SPA 从 SSAS 多维数据集呈现 PDF 报告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多