[英]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。
我可以這樣做,但我希望有一個已知的可修復原因導致此異常和/或是否有更清晰的方法來處理它。
我們在產品中遇到了這個問題,我們向微軟開了一張票,最后他們承認了.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.