Как просматривать отчеты служб отчетов SQL Server 2005 из ReportViewer Control в DMZ - PullRequest
0 голосов
/ 15 сентября 2008

Я хочу иметь возможность просматривать отчет служб отчетов SQL Server 2005 из приложения ASP.NET в DMZ через элемент управления ReportViewer. Сервер SQL и SSRS находятся за брандмауэром.

1 Ответ

3 голосов
/ 15 сентября 2008

`Поэтому мне пришлось изменить способ, которым приложение ASP.NET 2.0 вызывало отчеты со страниц. Первоначально я использовал JavaScript, чтобы открыть новое окно.

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

Проблема, с которой я столкнулся, заключалась в том, что вызов window.open будет работать только внутри клиентской сети, а не на новом веб-сервере, расположенном в их DMZ. Мне пришлось создать новый отчет WebForm со встроенным элементом управления ReportViewer для просмотра отчетов.

Другая проблема, с которой я столкнулся, заключалась в том, что к серверу отчетов приходилось обращаться с помощью Windows Authentication, поскольку он использовался другим приложением для отчетов, а это приложение использовало роли для доступа к отчетам. Итак, я пошел, чтобы получить свой элемент управления 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();
}
...