关于asp.net:如何从DMZ中的ReportViewer控件查看SQL Server 2005 Reporting Services报表

关于asp.net:如何从DMZ中的ReportViewer控件查看SQL Server 2005 Reporting Services报表

How do you view SQL Server 2005 Reporting Services reports from ReportViewer Control in DMZ

我希望能够通过ReportViewer控件从DMZ中的ASP.NET应用程序查看SQL Server 2005 Reporting Services报告。 SQLand SSRS服务器在防火墙后面。


`因此,我不得不更改ASP.NET 2.0应用程序从页面调用报表的方式。最初,我使用JavaScript打开一个新窗口。

1
ViewCostReport.OnClientClick ="window.open('" + Report.GetProjectCostURL(_PromotionID) +"','ProjectCost','resizable=yes')";

我遇到的问题是window.open调用只能在客户端网络内运行,而不能在位于其DMZ中的新Web服务器上运行。我必须创建一个新的报表WebForm,该WebForm嵌入了一个ReportViewer控件以查看报表。

我遇到的另一个问题是,必须使用Windows身份验证来访问报表服务器,因为该报表服务器被另一个应用程序用于报表,并且该应用程序使用角色进行报表访问。因此,我关闭了ReportViewer控件来模拟Windows用户。我发现解决方案是这样的:

创建一个新类,该类实现用于访问报告的Microsoft.Reporting.WebForms.IReportServerCredentials接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class ReportCredentials : Microsoft.Reporting.WebForms.IReportServerCredentials
{
    string _userName, _password, _domain;
    public ReportCredentials(string userName, string password, string domain)
    {
        _userName = userName;
        _password = password;
        _domain = domain;
    }

    public System.Security.Principal.WindowsIdentity ImpersonationUser
    {
        get
        {
            return null;
        }
    }

    public System.Net.ICredentials NetworkCredentials
    {
        get
        {
            return new System.Net.NetworkCredential(_userName, _password, _domain);
        }
    }

    public bool GetFormsCredentials(out System.Net.Cookie authCoki, out string userName, out string password, out string authority)
    {
        userName = _userName;
        password = _password;
        authority = _domain;
        authCoki = new System.Net.Cookie(".ASPXAUTH",".ASPXAUTH","/","Domain");
        return true;
    }
}

然后,我为按钮创建了一个事件以调用报告:

1
2
3
4
5
6
7
8
9
10
11
12
protected void btnReport_Click(object sender, EventArgs e)
{
    ReportParameter[] parm = new ReportParameter[1];
    parm[0] =new ReportParameter("PromotionID",_PromotionID);
    ReportViewer.ShowCredentialPrompts = false;
    ReportViewer.ServerReport.ReportServerCredentials = new ReportCredentials("Username","Password","Domain");
    ReportViewer.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;
    ReportViewer.ServerReport.ReportServerUrl = new System.Uri("http://ReportServer/ReportServer");
    ReportViewer.ServerReport.ReportPath ="/ReportFolder/ReportName";
    ReportViewer.ServerReport.SetParameters(parm);
    ReportViewer.ServerReport.Refresh();
}

推荐阅读