在 ASP .net core 2.1 中使用 WCF 或 Reporting Services 和 AlanJuden MvcReportViewer 的超时问题

Posted

技术标签:

【中文标题】在 ASP .net core 2.1 中使用 WCF 或 Reporting Services 和 AlanJuden MvcReportViewer 的超时问题【英文标题】:Timeout problem using WCF or Reporting Services with AlanJuden MvcReportViewer in ASP .net core 2.1 【发布时间】:2021-02-28 05:27:30 【问题描述】:

MVC 解决方案中有 2 个项目。一个 Web 应用程序和一个报告应用程序。网络应用程序按需提供报告。 Web 应用程序运行良好,在报告控制器中包含超时。 (_context.Database.SetCommandTimeout(300);)。

如果我运行任何报告或 WCF 作业,我会收到以下错误,但如果我立即再次运行它们,它们运行正常。如果我等到第二天,我会得到同样的结果。

似乎是与 Reporting Services 相关的常见问题,但我已经没有什么想法了。

报告错误: AggregateException:发生一个或多个错误。 (请求通道在 00:01:00 之后尝试发送超时。 增加传递给 Request 调用的超时值或增加 Binding 上的 SendTimeout 值。分配给此操作的时间可能是较长超时的一部分。)

System.Threading.Tasks.Task.GetResultCore(bool waitCompletionNotification)

TimeoutException:请求通道在 00:01:00 之后尝试发送超时。增加传递给 Request 调用的超时值或增加 Binding 上的 SendTimeout 值。 分配给此操作的时间可能是较长超时的一部分。

AsyncResult.cs 中的 System.Runtime.AsyncResult.End(IAsyncResult result),第 354 行。

WCF 错误: TimeoutException:对“http://keeper/ReportServer/ReportExecution2005.asmx”的 HTTP 请求已超过分配的超时时间 00:01:00。 分配给此操作的时间可能是较长超时的一部分。

System.ServiceModel.Channels.HttpChannelFactory+HttpClientRequestChannel+HttpClientChannelAsyncRequest.SendRequestAsync(消息消息, HttpChannelFactory.cs 中的 TimeoutHelper timeoutHelper),第 1048 行

TimeoutException:请求通道在 00:01:00 之后尝试发送超时。增加传递给 Request 调用的超时值或增加 Binding 上的 SendTimeout 值。 分配给此操作的时间可能是较长超时的一部分。

AsyncResult.cs 中的 System.Runtime.AsyncResult.End(IAsyncResult result),第 354 行。

已添加 web.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
      </handlers>
      <aspNetCore requestTimeout="00:30:00" processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    </system.webServer>
  </location>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding openTimeout="00:10:00"
                 closeTimeout="00:10:00"
                 sendTimeout="00:10:00"
                 receiveTimeout="00:10:00"
                 maxBufferPoolSize="2147483647" 
                 maxReceivedMessageSize="2147483647">
        </binding>
      </wsHttpBinding>
      <basicHttpBinding>
        <binding openTimeout="00:10:00"
                 closeTimeout="00:10:00"
                 receiveTimeout="00:10:00"
                 sendTimeout="00:10:00"
                 maxBufferPoolSize="2147483647"
                 maxReceivedMessageSize="2147483647"
                 maxBufferSize="2147483647">
        </binding>
      </basicHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

requestTimeout="00:30:00" 停止了 WCF 作业,因此现在要么无法启动,要么运行完成。 web.config 中的其他任何内容似乎都不会影响结果。

还查看了 C:/Program Files/Microsoft SQL Server Reporting Services/s-s-rS/ReportServer/rsreportserver.config 文件,但看不到任何可能与 00:01:00 问题有关的超时。

4/12/2020 已将 web.config 文件更改为:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  
  <location path="." inheritInChildApplications="false">
    
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
      </handlers>
      <aspNetCore startupTimeLimit="600" shutdownTimeLimit="600" requestTimeout="00:30:00" processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    </system.webServer>
  
    <system.serviceModel>
      
      <bindings>
        <basicHttpBinding>
          <binding name="ServiceReference1"
                   openTimeout="00:10:00"
                   closeTimeout="00:10:00"
                   receiveTimeout="00:10:00"
                   sendTimeout="00:10:00"
                   maxBufferPoolSize="2147483647"
                   maxReceivedMessageSize="2147483647"
                   maxBufferSize="2147483647">
          </binding>
        </basicHttpBinding>
      </bindings>

      <services>
        <service name="ServiceReference1">
          <endpoint address="http://Keeper/ReportServer/ReportExecution2005.asmx"
                    binding="basicHttpBinding"
                    bindingConfiguration="ServiceReference1"
                    contract=""/>
        </service>
      </services>
      
    </system.serviceModel>
    
  </location> 
  
</configuration>
enter code here

Latest web.config 6/12/2020

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
      </handlers>
      <aspNetCore requestTimeout="00:30:00" processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    </system.webServer>
  </location> 
</configuration>

【问题讨论】:

Theobald,感谢您的回复。我是这方面的新手(老大型机程序员),所以请与我裸露。我的 WCF 终点是 ReportExecution2005.asmx。不确定报告,因为它隐藏在 AlanJuden 的代码中。认为您的意思是我需要对 web.config 文件进行修改以在此端点内定义绑定。请问它是什么样子的? 已阅读文章(现在很困惑)。将我的 web.config 文件更改为::include: Keeper/ReportServer/ReportExecution2005.asmx" binding="basicHttpBinding"/> sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"> NO CHANGE 错误(重新运行仍然可以)并且仍然无法确定 1:00 分钟的来源。任何帮助将不胜感激。 【参考方案1】:

在您的配置文件中,我没有看到您的端点,并且绑定的超时属性未应用于端点。从报错来看,好像是timeout属性的问题。

对于不同的超时属性,最重要的是sendTimeout,表示客户端等待WCF服务响应的时间。

OpenTimeout 是您在打开与 WCF 服务的连接时愿意等待的时间。

同样,closeTimeout 是在等待抛出异常之前关闭连接(放置客户端代理)之前的等待时间。

ReceiveTimeout 是给予客户端接收和处理来自服务器的响应的时间。

您可以尝试增加超时属性并将其应用于端点。

wcf中如何配置endpoint,可以查看这个链接:Configuring Services Using Configuration Files

【讨论】:

【参考方案2】:

如 cmets 中所述,rsreportserver.config 文件中的 RecycleTime 会触发服务 SQL Server Reporting Services 的重新启动。 每次发生这种情况时,都需要对 Reporting Services 进行初始化,这是由该事件之后运行的第一个报表触发的。 如前所述,此初始化大约需要 2 分钟,并且(对我而言)会导致 1 分钟超时错误。

仍然不知道这个超时来自哪里,但是感谢 Pavel 和 https://pawlowski.cz/2011/07/31/solving-issue-long-starting-report-s-s-rs-2008/,这是解决方法

基本上这意味着:将 RecycleTime 设置为 1500(25 小时),创建一个每天早上运行的计划任务,这会触发 Powershell 脚本以重新启动 Reporting Services,然后访问 Reporting Services 文件夹以对其进行初始化。 注意:我只有 1 个用于 localhost 和生产的报告服务。如果你有 2 个,你可能需要 2 个工作。

Pavel 的 Powershell 脚本命令:

    停止服务“SQL Server Reporting Services (MSSQLSERVER)” 启动服务“SQL Server Reporting Services (MSSQLSERVER)” $wc = 新对象 system.net.webClient $cred = [System.Net.CredentialCache]::DefaultNetworkCredentials $wc.Credentials = $cred $src = $wc.DownloadString("http://localhost/Reports/Pages/Folder.aspx")

我使用了以下内容并将其包含在我的解决方案中以将它们保持在一起:

    echo "重新启动 SQL Server Reporting Services" 重启服务“SQL Server Reporting Services” 开始-睡眠-s 30 回显“SQL Server Reporting Services 可用” $wc = 新对象 system.net.webClient $cred = [System.Net.CredentialCache]::DefaultNetworkCredentials $wc.Credentials = $cred echo "Reporting Services 初始化开始" $src = $wc.DownloadString("http://keeper/ReportServer/Reports") echo "Reporting Services 初始化完成" 开始-睡眠-s 30 echo "启动完成"

运行大约需要 3 分钟。 我注意到 Reporting Services 在重新启动后大约需要 15 秒才能变为可用,这就是我在第 3 步进入睡眠状态的原因。 第 9 步。我相当确定“localhost”将与您的服务器名称(在我的情况下为“keeper”)相同。您只需要文件夹,而不需要实际报告。 步骤 11 以防初始化尚未完成。凌晨 2 点,我不在乎多花几分钟。 回声用于测试。

我使用了具有以下设置的任务计划程序: 一般的;名称 s-s-rS_Startup 触发器:启用每日凌晨 2 点 操作:启动程序 C:\Windows\System32\WindowsPowerShell\V1.0\powershell.exe -ExecutionPolicy Bypass -file "s-s-rS_Startup.ps1" 设置:允许任务按需运行

详细说明它们,因为它们很重要,尤其是操作。

【讨论】:

以上是关于在 ASP .net core 2.1 中使用 WCF 或 Reporting Services 和 AlanJuden MvcReportViewer 的超时问题的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 2.1 在视图中使用 HttpContext

在 ASP.NET Core 2.1 中使用 cookie [重复]

如何在 ASP.NET Core 2.1 中使用自动完成输入引发模式

学习 ASP.NET Core 2.1:集成测试中使用 WebApplicationFactory

ASP.Net Core 2.1 注册自定义 ClaimsPrincipal

ASP Net Core 2.1 会话