1

我正在创建一个 Web 应用程序(mvc 4)来授权客户(使用会员提供者)查看他们注册的报告(SSRS 2008),但他们对我们的报告服务器没有任何访问权限。

基于链接How do I render a remote ReportViewer aspx page in MVC4? ,我已经实现了 Elsimer 的最新答案,它可以很好地下载为 pdf 文件。

但是当我尝试使用上面链接中提到的相同代码呈现为 html 时,它要求 Windows 凭据访问报表服务器。

所以我提供了一个通用凭证,它可以通过代码访问报告服务器中的所有报告。但是当他们尝试在客户端浏览器中查看为 html 时,它仍然要求报表服务器的凭据。报告正在呈现,但图像和图表在没有凭据的情况下无法呈现。

请指教,我已经尝试了很多方法来解决这个问题。但没有运气。

我的控制器和凭证类代码如下:

[Route("report/MonthlySummary")]
    [ValidateAntiForgeryToken]
    public ActionResult MonthlySummary(MonthlyReportParameters model)
    {


        if (ModelState.IsValid)
        {
            try
            {
                var actionType = model.ActionType;
                if (actionType == "View Report")
                {
                    return ExportMonthlyReportToHtml(model);
                }
                else if (actionType == "Download pdf report")
                {
                    return ExportMonthlyReportToPdf(model);
                }
            }
            catch (Exception ex)
            {
        //Logging errors
            }
        }
        return null;
    }

    private ActionResult ExportMonthlyReportToHtml(MonthlyReportParameters monthlyParams)
    {
        ReportViewer reportViewer = BuildMonthlyReport(monthlyParams);
        reportViewer.ServerReport.Refresh();
        byte[] streamBytes = null;
        string mimeType = "";
        string encoding = "";
        string filenameExtension = "";
        string[] streamids = null;
        Warning[] warnings = null;

        //To view the report in html format
        streamBytes = reportViewer.ServerReport.Render("HTML4.0", null, out mimeType, out encoding, out filenameExtension, out streamids, out warnings); 
        var htmlReport = File(streamBytes, "text/html");           
        return htmlReport;
    }

    private static ReportViewer BuildMonthlyReport(MonthlyReportParameters model)
    {
        ReportViewer reportViewer = new Microsoft.Reporting.WebForms.ReportViewer();
        try
        {
            var rptParameters = new List<ReportParameter>
            {
                //Building parameters
            };

            reportViewer.ProcessingMode = ProcessingMode.Remote;
            reportViewer.ServerReport.ReportPath = "/reportFolder/reportName"; 
            var reportServerUrl = ConfigurationManager.AppSettings["ReportServerUrl"];
            if(!string.IsNullOrEmpty(reportServerUrl))
            {
                reportViewer.ServerReport.ReportServerUrl = new Uri(reportServerUrl);
            }

            reportViewer.ServerReport.ReportServerCredentials = new ReportServerCredentials();
            reportViewer.ServerReport.SetParameters(rptParameters);
        }
        catch (Exception ex)
        {
            var errorMessage = ex.Message;
            //TODO: handle errors;
        }
        return reportViewer;
    }


    public sealed class ReportServerCredentials : IReportServerCredentials
{
    public bool GetFormsCredentials(out Cookie authCookie, out string userName, out string password, out string authority)
    {
        authCookie = null;
        userName = null;
        password = null;
        authority = null;
        return false;
    }

    public WindowsIdentity ImpersonationUser
    {
        get
        {
            return null;
        }
    }

    public ICredentials NetworkCredentials
    {
        get
        {
            string userName = ConfigurationManager.AppSettings["ReportUserName"];

            if ((string.IsNullOrEmpty(userName)))
            {
                throw new Exception("Missing user name from web.config file");
            }

            string password = ConfigurationManager.AppSettings["ReportPassword"];

            if ((string.IsNullOrEmpty(password)))
            {
                throw new Exception("Missing password from web.config file");
            }

            string domain = ConfigurationManager.AppSettings["DomainName"];

            if ((string.IsNullOrEmpty(domain)))
            {
                throw new Exception("Missing domain from web.config file");
            }

            return new NetworkCredential(userName, password, domain);
        }
    }

}

提前致谢,

4

0 回答 0