簡體   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