Frage

Ich möchte in die Lage, einen SQL Server 2005 Reporting Services-Bericht von einer ASP.NET-Anwendung in einer DMZ über ein Reportviewer-Steuerelement anzuzeigen. Der SQLand SSRS-Server hinter der Firewall.

War es hilfreich?

Lösung

`So hatte ich die Möglichkeit, eine Anwendung von ASP.NET 2.0 Berichte von Seiten aufgerufen zu ändern. Ursprünglich habe ich verwendet JavaScript ein neues Fenster zu öffnen.

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

Das Problem, das ich hatte, war, dass der window.open Anruf nur im Client-Netzwerk und nicht auf einen neuen Web-Server befindet sich in der DMZ funktionieren würde. Ich musste einen neuen Bericht Webformular erstellen, die ein Reportviewer-Steuerelement eingebettet, die Berichte anzuzeigen.

Das andere Problem, das ich hatte, ist, dass der Report Server mit Windows-Authentifizierung zugegriffen werden mußte, da es wurde von einer anderen Anwendung für Berichte verwendet wird, und dass App verwendet Rollen für den Berichtszugriff. Also ging ich meine Report Kontrolle bekommen einen Windows-Benutzer zu verkörpern. Ich fand die Lösung, dies zu sein:

Erstellen

eine neue Klasse, die die Schnittstelle implementiert Microsoft.Reporting.WebForms.IReportServerCredentials für die Berichte zugreifen.

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

Dann habe ich ein Ereignis für den um den Bericht zu nennen:

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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top