答えて

3

`ASP.NET 2.0アプリケーションのレポートをページから呼び出す方法を変更する必要がありました。もともとは、JavaScriptを使って新しいウィンドウを開きました。私が持っていた

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

問題は、window.open呼び出しだけ自分のDMZにある新しいWebサーバー上でクライアントネットワーク内で動作していないということでした。レポートを表示するためにReportViewerコントロールを埋め込んだ新しいレポートWebFormを作成する必要がありました。

私が持っていたもう1つの問題は、レポートサーバーがレポート用に別のアプリケーションによって使用されていたため、Windows認証でアクセスする必要があったことです。そこで、私はWindowsユーザーを偽装するためにReportViewerコントロールを取得するようになりました。

レポートにアクセスするためのMicrosoft.Reporting.WebForms.IReportServerCredentialsインターフェイスを実装する新しいクラスを作成します。

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

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

は、その後、私はレポートを呼び出すためのボタンのイベントを作成しました

関連する問題