从远程 pc 在 C# 中生成 s-s-rS 2008 R2 报告比从本地 pc 慢

Posted

技术标签:

【中文标题】从远程 pc 在 C# 中生成 s-s-rS 2008 R2 报告比从本地 pc 慢【英文标题】:Generating s-s-rS 2008 R2 report in C# from remote pc is slower than from local pc 【发布时间】:2013-03-20 11:45:43 【问题描述】:

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

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

我们创建了一个从 s-s-rS 实例生成报告的 c# 应用程序。

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

当我从远程机器运行完全相同的应用程序时(相同的网络,只是与 s-s-rS 实例不同的电脑),相同的报告需要 +- 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://&lt;server name&gt;/ReportServer(这里的服务器名称是实际名称,但我也尝试过使用 IP)。

我对上述每个步骤都进行了计时,anf 发现罪魁祸首在它设置参数的那一行。所以我将参数值存储在实际报告中的默认值中,并删除了该步骤。然后渲染时间就比以前长了。

除此之外,我还尝试将 Reporting Service Configuration Manager 服务帐户从网络更改为本地帐户,并使用位于 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 阅读时删除了&lt;RSWindowsNegotiate/&gt;

RSWindowsNegotiate

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

但这没有帮助。

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

【问题讨论】:

【参考方案1】:

不幸的是,您可能已将应用程序从睡眠中唤醒。出于某种原因,在空闲时间到期后让 s-s-rs 重新联机会在启动和加载环境的过程中对您造成不利影响。一旦应用重新上线,它就会以预期的方式处理请求。

如果您可以通过创建每小时任务来轮询资源来使系统摆脱问题并提高系统响应速度。

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

    $wc = 新对象 system.net.webClient $username = '报表管理员' $password = '报表管理员' $cred = New-Object System.Management.Automation.PSCredential -ArgumentList @($username,(ConvertTo-SecureString -String $password -AsPlainText -Force))

    $wc.Credentials = $cred
    $src = $wc.DownloadString(“http://<s-s-rSSERVERNAME>/s-s-rS/Pages/Folder.aspx”)
    

    在脚本文件夹中创建一个包含以下内容的批处理文件:

powershell -command "& 'C:\\SRSWakeup.ps1'"

    创建一个每小时运行一次并保持 s-s-rs 活动的作业。您可以通过保存并将此内容导入 Windows 任务管理器来做到这一点:(它将调用 .cmd 来调用 power shell 命令以保持 s-s-rs 活动。

     <?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>
    

【讨论】:

非常感谢您的努力,但第一行显示为 (请注意,这不是首次运行的问题,每次都会发生这种情况)跨度>

以上是关于从远程 pc 在 C# 中生成 s-s-rS 2008 R2 报告比从本地 pc 慢的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中生成时间和日期并为 mysql 格式化?

如何使用 roslyn 在 C# 中生成/编辑打字稿代码

s-s-rS 报告中的空白页和对齐问题

在 C# 中生成颜色渐变

在 C# 中生成随机数 [重复]

如何在 C# 中生成随机颜色名称