繁体   English   中英

WCF Net.Msmq服务偶尔会出现故障

[英]WCF Net.Msmq Service occasionally faults

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

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

时间戳:3/21/2015 5:37:06 PM消息:HandlingInstanceID:a26ffd8b-d3b4-4b89-9055-4c376d586268发生并捕获了类型'System.ServiceModel.MsmqException'的异常。 -------------------------------------------------- ------------------------------- 03/21/2015 13:37:06类型:System.ServiceModel.MsmqException,System .ServiceModel,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089消息:从队列接收消息时发生错误:事务的操作顺序不正确。 (-1072824239,0xc00e0051)。 确保已安装并运行MSMQ。 确保队列可用于接收。 源:System.ServiceModel帮助链接:ErrorCode:-1072824239数据:System.Collections.ListDictionaryInternal TargetSite:Boolean TryReceive(System.TimeSpan,System.ServiceModel.Channels.Message ByRef)dynatrace_invocationCount:0 Stack Trace:at System.ServiceModel.Channels。 System.ServiceModel.Dispatcher.InputChannelBinder.TryReceive(TimeSpan timeout,RequestContext&requestContext)中的MsmqInputChannelBase.TryReceive(TimeSpan超时,消息和消息),位于System.ServiceModel.Dispatcher.ErrorHandlingReceiver.TryReceive(TimeSpan timeout,RequestContext&requestContext)

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

我可以这样做,但我希望有一个已知的可修复原因导致此异常和/或是否有更清晰的方法来处理它。

我们的生产环境也存在同样的问题。 不幸的是, 微软已经开启了一个问题 ,但自2013年以来它被标记为“已关闭为延迟”.EasySR20提到了以下解决方法:

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

我还没有证实这解决了这个问题,但这是一个选择。

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

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

该问题已在Windows Server 2008和2012上报告,但从未在2016年或Windows 10上报告过。

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

恢复服务的代码如下:

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

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分钟)> =
DefaultTimeOut(15分钟)> = WCF服务transactionTimeout>
receiveTimeout()

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM