从远程PC生成C#中的SSRS 2008 R2报告比从本地PC生成慢

时间:2013-03-20 11:45:43

标签: c# ssrs-2008

(请注意,这不是第一次运行问题,每次都会发生这种情况)

我想知道是否有人遇到以下情况。

我们创建了一个c#应用程序,用于从SSRS实例生成报告。

当我在SSRS实例所在的服务器上运行此应用程序时,报告会在+ - 6秒内生成。

当我从远程盒子(同一个nework,只是不同的PC到SSRS实例)运行完全相同的应用程序时,相同的报告需要+ - 18秒。

使用的代码类似于

ServerReport report = new ServerReport();
report.ReportServerUrl = new System.Uri(reportSetup.ConnectionString);
report.ReportServerCredentials.NetworkCredentials = System.Net.CredentialCache.DefaultCredentials;
report.ReportPath = reportName;
report.SetParameters(reportParams);
byte[] bytes = report.Render("PDF", null, out mimeType, out encoding, out extension, out streamids, out warnings);

,其中 ServerReport来自Microsoft.Reporting.WinForms来自C:\Program Files (x86)\Microsoft Visual Studio 10.0\ReportViewer\Microsoft.ReportViewer.WinForms.dll(但也尝试过网络版),其余内容声明为

Warning[] warnings;
string[] streamids;
string mimeType;
string encoding;
string extension;
List<ReportParameter> reportParams

和reportSetup.ConnectionString的格式为http://<server name>/ReportServer(此处服务器名称是实际名称,但我也尝试过使用IP)。

我为上述每个步骤计时,并且发现罪魁祸首是在它设置参数的行上。因此,我将参数值存储在实际报告的默认值中,并删除了该步骤。然后渲染只需要比以前更长的时间。

除此之外,我还尝试将Reporting Service配置管理器服务帐户从网络更改为本地帐户,并使用C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer中找到的配置文件(rsreportserver.config)中的身份验证设置进行操作

最初验证设置为

<Authentication>
    <AuthenticationTypes>
        <RSWindowsNegotiate/>
        <RSWindowsNTLM/>
    </AuthenticationTypes>
    <RSWindowsExtendedProtectionLevel>Off</RSWindowsExtendedProtectionLevel>
    <RSWindowsExtendedProtectionScenario>Proxy</RSWindowsExtendedProtectionScenario>
    <EnableAuthPersistence>true</EnableAuthPersistence>
</Authentication>

我在阅读Authentication Types in Reporting Services

时删除了行<RSWindowsNegotiate/>
  

RSWindowsNegotiate

     

RSWindowsNegotiate指示报表服务器处理身份验证   指定协商的请求。协商尝试Kerberos   首先进行身份验证,但如果是Active Directory则回退到NTLM   无法将客户端请求的票证授予报表服务器。   如果票证不可用,谈判将只回到NTLM。   如果第一次尝试导致错误而不是丢失票证,   报表服务器不会再次尝试。

但这没有帮助。

是否有人对如何更正代码或SSRS安装有任何想法?我希望应用程序位于与SSRS实例相同的服务器上。

1 个答案:

答案 0 :(得分:0)

你可能不幸从睡眠中唤醒了应用程序。出于某种原因,在空闲时间到期后将ssrs重新联机将使您在启动和加载环境的过程中受到惩罚。一旦应用程序重新联机,它就会以可预期的方式处理请求。

如果您可以通过创建每小时任务来轮询资源,那么可以将唤醒从出现问题的图片中解脱出来并使系统更具响应性。

  1. 在脚本文件夹中创建包含以下内容的PowerShell文件:

      

    $ wc = New-Object system.net.webClient            $ username ='ReportAdmin'            $ password ='ReportAdmin'            $ cred = New-Object System.Management.Automation.PSCredential -ArgumentList @($ username,(ConvertTo-SecureString -String $ password -AsPlainText -Force))

    $wc.Credentials = $cred
    $src = $wc.DownloadString(“http://<SSRSSERVERNAME>/SSRS/Pages/Folder.aspx”)
    
  2. 使用以下内容在脚本文件夹中创建批处理文件:

  3.   

    powershell -command“&amp;'C:\\ SRSWakeup.ps1'”

    1. 创建一个每小时运行一次的作业,让ssrs保持活力。您可以通过将此内容保存并导入到Windows任务管理器中来实现此目的:(它将调用.cmd来调用power shell命令以使ssrs保持活动状态。

       <?xml version="1.0" encoding="UTF-16"?> <Task version="1.2"
        xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">  
       <RegistrationInfo>
            <Date>2012-10-29T17:57:58.8640417</Date>
            <Author>SERVER\AdminAccount</Author>
           <Description>Wakes up Reporting services when the service shuts down</Description>   </RegistrationInfo>   <Triggers>
            <CalendarTrigger>
             <Repetition>
                <Interval>PT1H</Interval>
                <StopAtDurationEnd>false</StopAtDurationEnd>
              </Repetition>
              <StartBoundary>2012-11-01T21:06:52.4488088</StartBoundary>
              <Enabled>true</Enabled>
              <ScheduleByDay>
                <DaysInterval>1</DaysInterval>
              </ScheduleByDay>
          </CalendarTrigger>   </Triggers>   <Principals>
            <Principal id="Author">
              <UserId>SERVER\AdminUser</UserId>
              <LogonType>Password</LogonType>
              <RunLevel>LeastPrivilege</RunLevel>
            </Principal>   </Principals>   <Settings>
            <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
            <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
            <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
            <AllowHardTerminate>true</AllowHardTerminate>
            <StartWhenAvailable>true</StartWhenAvailable>
            <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
            <IdleSettings>
              <StopOnIdleEnd>true</StopOnIdleEnd>
              <RestartOnIdle>false</RestartOnIdle>
            </IdleSettings>
           <AllowStartOnDemand>true</AllowStartOnDemand>
            <Enabled>true</Enabled>
            <Hidden>false</Hidden>
            <RunOnlyIfIdle>false</RunOnlyIfIdle>
            <WakeToRun>false</WakeToRun>
            <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
            <Priority>7</Priority>   </Settings>   <Actions Context="Author">
            <Exec>
              <Command>C:\<ScriptFolder\wakeup.cmd</Command>
            </Exec>   </Actions> </Task>