0

私の質問のタイトルはあまり意味がないと確信していますが、今ではもっとよく考えることができませんでした.

問題: 私の主なタスクは、SSRS レポートのすべてのページを、ASP.NET MVC アプリケーションのいずれかのページ内のポップアップに表示することです。

これを達成するために、以下のアプローチを使用しました。

  1. MyPage.cshtml に jQuery ポップアップを追加します (このポップアップ内にレポート コンテンツが必要です)。
  2. このポップアップが開くと (一部のクライアント アクションで)、2 番目のページ proxyPage.aspx に対して jquery ajax 要求を行います。
  3. プロキシ ページで、ネットワーク資格情報を使用して reportserver に Web リクエストを送信し、レポート html を取得します。

        WebRequest request = WebRequest.Create( "http://MyReportServer/ReportServer?/ MyReportName&rs:Command=Render&rs:Format =HTML4.0&rc:Toolbar=false&Param1=blabla123");
        request.Credentials = new NetworkCredential(MYUSERNAME, MYPASSWORD);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream receiveStream = response.GetResponseStream();
        StreamReader readStream = new StreamReader(receiveStream, System.Text.Encoding.UTF8);
        string str = readStream.ReadToEnd();
        Response.Write(str);
    
  4. proxyPage からの HTML ポップアップ内の div に書き込むか、iframe を使用してその中に完全なプロキシ ページを表示します。

  5. ここまではうまくいきましたが、その後、この質問を書いている別の問題が発生します

  6. レポートの HTML がポップアップに表示されると、レポート サーバーにレポートに埋め込まれた画像を取得するように要求します。

レポート サーバーへのこれらの要求では、手順 3 で行ったようにネットワーク資格情報が送信されないため、資格情報の入力を求めるプロンプトが表示されます。

これらの画像リクエストが、以前に提供した資格情報によって何らかの形で認証されるようにするアプローチが必要です。

4

1 に答える 1

0

SSRS は、指定した場所でリソースをストリーミングします。

private byte[] InternalRenderReport(Report report, List<ReportParameter> parameters, string format, int pageNumber, ref int totalPages, string virtualTempFolder, string physicalTempFolder)
        {
            CheckConnection();
            byte[] result = null;
            ReportExecution2005.ReportExecutionService _execService=new ReportExecution2005.ReportExecutionService();


            sys = _systemService.GetCurrentSystem();
            _execService.Url = sys.ReportingServices.ServiceRootURL+"/ReportExecution2005.asmx";
            NetworkCredential credentials = new NetworkCredential(sys.ReportingServices.Credentials.UserName, 
                                                                 sys.ReportingServices.Credentials.Password,
                                                                 sys.ReportingServices.Credentials.Domain);
            _execService.Credentials=credentials;

            ReportExecution2005.ParameterValue[] rsParams = null;
            if (parameters != null)
            {
                rsParams = new ReportExecution2005.ParameterValue[parameters.Count];
                int x = 0;
                foreach (ReportParameter p in parameters)
                {
                    rsParams[x] = new ReportExecution2005.ParameterValue();
                    rsParams[x].Name = p.ParameterName;
                    rsParams[x].Value = p.SelectedValue;
                    x++;
                }
            }
            StringBuilder devInfo = new StringBuilder();
            if (format.ToUpper().StartsWith("HTML"))
            {
                devInfo.Append("<DeviceInfo>");
                devInfo.Append("<HTMLFragment>True</HTMLFragment>");
                devInfo.Append("<Section>" + pageNumber.ToString() +"</Section>");
                devInfo.Append("<StreamRoot>" + virtualTempFolder + "</StreamRoot>");
                /*devInfo.Append("<Zoom>200</Zoom>");*/
                devInfo.Append("</DeviceInfo>");                
            }
            else
                 devInfo.Append("<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>");

            string extension;
            string mimeType;
            string encoding;
            string[] streamIDs = null;
            ReportExecution2005.Warning[] warnings = null;




            ReportExecution2005.ExecutionHeader execHeader = new ReportExecution2005.ExecutionHeader();
            ReportExecution2005.ExecutionInfo rpt = _execService.LoadReport(report.ReportPath, null);

            if(rsParams!=null)
                _execService.SetExecutionParameters(rsParams, "en-us");
            _execService.ExecutionHeaderValue = execHeader;
            _execService.ExecutionHeaderValue.ExecutionID = rpt.ExecutionID;


            //result = _execService.Render2(format, devInfo, ReportExecution2005.PageCountMode.Actual, out extension, out mimeType, out encoding, out warnings, streamIDs);
            result =  _execService.Render(format, devInfo.ToString(), out extension, out mimeType, out encoding, out warnings, out streamIDs);

            if (format.ToUpper().StartsWith("HTML"))
            {


                // For each image stream returned by the call to render,
                // render the stream and save it to the application root
                string FilePath = physicalTempFolder;
                byte[] image;
                // For each image stream returned by the call to render,
                // render the stream and save it to the application root
                foreach (string streamID in streamIDs)
                {
                    image = _execService.RenderStream("HTML4.0", streamID, null, out encoding, out mimeType);

                    FileStream stream = File.OpenWrite(FilePath + streamID);
                    stream.Write(image, 0, image.Length);                    
                    stream.Close();
                }
            }

            rpt = _execService.GetExecutionInfo();
            totalPages = rpt.NumPages;

            return result;
        }

これにより、未加工の HTML またはファイルをプッシュするコンテンツが返されます。サーバーに展開するソリューションに一時フォルダーを追加しました。ストリームを使用するときに ssrs がレンダリングするように、次のコンテンツを含む web.config ファイルを temp フォルダーに配置して、拡張機能の少ないコンテンツを許可できます。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <staticContent>

      <mimeMap fileExtension=".*" mimeType="image/png" />


    </staticContent>
    <handlers>
      <clear />

      <add name="StaticFile" path="*" verb="*" type="" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" scriptProcessor="" resourceType="Either" requireAccess="Read" allowPathInfo="false" preCondition="" responseBufferLimit="4194304" />
    </handlers>
  </system.webServer>
</configuration>

次に、次の関数を使用して、物理および仮想一時フォルダーを取得します。

PhyscicalTempFolder= AppDomain.CurrentDomain.BaseDirectory + @"Temp\";
VirtualTempFolder=return  Url.Content("~/Temp/");

最後に、毎日の後にクリーンアップするには、次のような powershell コマンドを追加できます。

Remove-Item D:\xxx\WebApplications\ExternalReports\Temp\* -exclude *.config

次に、PS スクリプトを呼び出す .bat を追加します。

powershell -command "& 'C:\xxx\Scripts\SSRSCleanTempFiles\SSRSCleanTempFiles.ps1'"

これにより、サーバーでスケジュールされたタスクを構成して、毎日 .bat ファイルを呼び出し、アプリケーションの一時フォルダーをクリーンアップできます。

于 2013-04-28T01:20:23.807 に答える