كيف يمكنك عرض تقارير خدمات تقارير SQL Server 2005 من التحكم ReportViewer في DMZ

StackOverflow https://stackoverflow.com/questions/63882

سؤال

أريد أن أكون قادرًا على عرض تقرير خدمات تقارير SQL Server 2005 من تطبيق ASP.NET في المنطقة المجردة من السلاح من خلال عنصر تحكم ReportViewer.خادم SQLand SSRS موجود خلف جدار الحماية.

هل كانت مفيدة؟

المحلول

`لذا كان علي أن أغير الطريقة التي يستدعي بها تطبيق ASP.NET 2.0 التقارير من الصفحات.في الأصل، استخدمت JavaScript لفتح نافذة جديدة.

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

كانت المشكلة التي واجهتني هي أن مكالمة window.open ستعمل فقط داخل شبكة العميل وليس على خادم ويب جديد موجود في المنطقة المجردة من السلاح.اضطررت إلى إنشاء تقرير WebForm جديد يتضمن عنصر تحكم ReportViewer لعرض التقارير.

المشكلة الأخرى التي أواجهها هي أنه يجب الوصول إلى خادم التقارير باستخدام مصادقة Windows نظرًا لأنه تم استخدامه بواسطة تطبيق آخر للتقارير وكان هذا التطبيق يستخدم الأدوار للوصول إلى التقارير.لذلك ذهبت للحصول على عنصر تحكم ReportViewer الخاص بي لانتحال شخصية مستخدم Windows.لقد وجدت الحل ليكون هذا:

قم بإنشاء فئة جديدة تطبق واجهة Microsoft.Reporting.WebForms.IReportServerCredentials للوصول إلى التقارير.

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

ثم قمت بإنشاء حدث للزر لاستدعاء التقرير:

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();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top