【问题标题】:WCF Net.Msmq Service occasionally faultsWCF Net.Msmq 服务偶尔出现故障
【发布时间】:2015-05-27 01:12:52
【问题描述】:

我有一个自托管的 WCF 服务(在 Windows 服务中运行)。此服务侦听 MSMQ 上的消息。该服务是 PerCall 和 Transactional,在 Windows 2008 R2、.NET 4.0、MSMQ 5.0 上运行。

该服务每隔几周就会停止处理一次消息。 Windows 服务仍在运行,但 WCF 服务主机本身停止。服务主机出现以下异常:

时间戳:2015 年 3 月 21 日下午 5:37:06 消息:HandlingInstanceID: a26ffd8b-d3b4-4b89-9055-4c376d586268 类型异常 'System.ServiceModel.MsmqException' 发生并被捕获。 -------------------------------------------------- ------------------------------- 03/21/2015 13:37:06 类型:System.ServiceModel.MsmqException, System.ServiceModel,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089 消息:发生错误时 从队列接收消息:事务的操作 顺序不正确。 (-1072824239,0xc00e0051)。确保 MSMQ 是 安装并运行。确保队列可以接收 从。来源:System.ServiceModel 帮助链接:错误代码: -1072824239 数据:System.Collections.ListDictionaryInternal TargetSite:布尔 TryReceive(System.TimeSpan, System.ServiceModel.Channels.Message ByRef) dynatrace_invocationCount :0堆栈跟踪:在 System.ServiceModel.Channels.MsmqInputChannelBase.TryReceive(时间跨度 超时,消息和消息)在 System.ServiceModel.Dispatcher.InputChannelBinder.TryReceive(时间跨度 超时,请求上下文和请求上下文)在 System.ServiceModel.Dispatcher.ErrorHandlingReceiver.TryReceive(时间跨度 超时,RequestContext&requestContext)

搜索特定异常(“事务的操作顺序不正确”)不会产生很多信息。对于如何修复故障服务的大多数建议是在故障事件中重新启动服务主机。

我可以这样做,但我希望有一个已知的可解决此异常的原因和/或是否有更简洁的方法来处理它。

【问题讨论】:

    标签: wcf msmq-wcf


    【解决方案1】:

    我们在生产环境中遇到了同样的问题。不幸的是,有一个关于它的issue opened with Microsoft,但它自 2013 年以来被标记为“已延期关闭”。EasySR20 提到了以下解决方法:

    如果您将服务的 receiveTimeout 设置为比 服务的 transactionTimeout 这将防止异常 发生并关闭服务主机。这两个都是设置 可以在服务器的 app.config 文件中设置。

    我还没有确认这可以解决问题,但这是一种选择。

    我们已经实现了服务故障重启选项。

    【讨论】:

      【解决方案2】:

      我们在产品中遇到了这个问题,我们向微软开了一张票,最后他们承认这是 .NET Framework 中的一个错误,很快就会修复。

      在 windows server 2008 和 2012 上报告了该问题,但在 2016 或 windows 10 上从未报告过。

      所以我们做了两个解决方案,建议所有客户升级到 Windows 2016,我们添加了一个代码来处理服务主机重启服务的故障(您可以通过重启 MSMQ 服务来模拟相同的错误,而WCF 服务主机已打开。

      恢复服务的代码如下:

      首先为主机添加一个事件处理程序来处理“故障”事件:

      SH.Faulted += new EventHandler(SH_Faulted);
      //SH is the ServiceHost
      

      然后在事件处理程序内部

       private static void SH_Faulted(object sender, EventArgs e)
              {
      
              if (SH.State != CommunicationState.Opened)
              {
      
                  int intSleep = 15 * 1000;
                  //Abort the host
                  SH.Abort();
      
                  //Remove the event
                  SH.Faulted -= new EventHandler(SH_Faulted); 
      
                  //I sleep to make sure that the MSMQ have enough time to recover, better make it optional.
                  System.Threading.Thread.Sleep(intSleep);
                  try
                  {
                      ReConnectCounter++;
                      LogEvent(string.Format("Service '{0}' faulted restarting service count # {1}", serviceName, ReConnectCounter));
      
                        //Restart the service again here
                  }
                  catch (Exception ex)
                  {
                      //failed.. .you can retry if you like
                  }
              }
          }
      

      最终错误会再次发生,但您的服务将继续正常工作,直到 Microsoft 解决问题或您升级到 2016

      更新: 经过进一步调查,在微软的帮助下,我们找到了问题的根本原因,即以下之间的超时顺序:

      MachineLeveDTCTimeOut(20 分钟)>=
      默认超时(15 分钟)>= WCF 服务事务超时 >
      接收超时()

      因此,通过添加以下内容应该可以解决此问题:

      <system.transactions>
            <defaultSettings timeout="00:05:00"/>
      </system.transactions>
      

      更详细的文章: https://blogs.msdn.microsoft.com/asiatech/2013/02/18/wcfmsmq-intermittent-mq_error_transaction_sequence-error/

      【讨论】:

        猜你喜欢
        • 2013-06-14
        • 1970-01-01
        • 2011-07-16
        • 2016-08-05
        • 2010-11-14
        • 1970-01-01
        • 2010-12-06
        • 1970-01-01
        • 2011-04-02
        相关资源
        最近更新 更多