0

thanks to all for your time and efforts trying to help me solve this.

Now lets get to it... I have an AngularJS SPA. I would like to provide links on my view page, that when clicked, open a new tab and launch pre-existing SSRS reports in PDF format. Technically what I am trying to do: Render an SSRS report in my Repository, pass that through my WEB API then on to my SPA for display in a new tab.

One important note before I go any further: This setup, method, approach works flawlessly on my local machine within Visual Studio. It's when I move my SPA to a remote Web server (the same server that hosts SSRS) that I have a problem.

My Landscape:

Local Development Machine (Windows 7 Pro, VS2015 Pro)
Server1 (Win Server 2012R2): Hosts IIS (8), SPA, SQL (2014) and SSRS
Server2 (Win Server 2012R2). Hosts SSRS (SQL 2012) source of data (happens to be SSAS cubes, but I don't think that matters).

On My Local Development Machine:

As stated above the solution works fine through Visual Studio. The only part of the solution on my local machine is the SPA. The SSRS and SQL portion are located remotely. I can launch my SPA, click on a link and new tab opens containing the PDF report. I can also make a call directly to the web API and display a PDF report (http://localhost:3040/api/dataservice/ProductivityReportH/)

Problem 1

Browsing to the deployed version of my SPA on Server1, the application displays fine. But, if I click on a report hyperlink I get a the following message:

Do you want to open or save ProductivityReportH/ (3.28KB) from Server1?

No matter what I click (Open, Save, Cancel) nothing happens.

If I try and launch the report directly through the API, I get the same message. There are no errors displayed in the console window. I could find no errors in the Server1 log files.

On Server1: I can display the report via the SSRS report viewer.

Problem 1A

Using a browser on Server1, I can display the application just fine. But, if I click on a report hyperlink I get the same message as Problem 1. If I try to launch the report directly through the web API (http://Server1/projecttracker/api/dataservice/ProductivityReportH/) on Server1, I get the same message.

Any ideas would be greatly appreciated

My SPA Setup:

View Page:

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

My Controller:

(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)
}());

The 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;
        }
    }
}

The 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;
        }
    }
}
Brian
  • 145
  • 1
  • 1
  • 10

1 Answers1

0

Finally! For those that are interested...

Found this from nearly two years ago.

AppPool Permission Issue with Accessing Report Server

In particular the comment below:

Almost the same situation here except IIS and Report Server running on Windows Server 2008 R2. I used to have the asp.net application running with it's own application pool and everything worked. When I changed the application to the DefaultAppPool (due to a different problem), I got the permissions problem. I changed the Identity of the DefaultAppPool from ApplicationPoolIdentity to LocalSystem (in IIS, Advanced Settings) and it worked again.

Changed web server default app pool to LocalSystem and wha-la, I am rendering PDF reports from an SSAS cube through my AngularJS SPA.

Community
  • 1
  • 1
Brian
  • 145
  • 1
  • 1
  • 10