簡體   English   中英

使用 CRM 2013 組織服務時頻繁的連接中止異常

[英]Frequent connection aborted exceptions when using CRM 2013 Organization Service

我在運行連接到 CRM 的 WCF 服務時遇到問題:它經常產生 CommunicationObjectAbortedExceptions,這讓我懷疑我是否做錯了什么。 在許多人開始使用它之后,這些 execpions 開始發生,在它的測試系統上它沒有問題。

但是讓我們從頭開始:我編寫了兩個連接到 Microsoft CRM2013 組織服務的 WCF 服務,使用我自己的庫在 CRM 上執行查詢。 這些服務由 CRM 定期調用,每天約有 100-200 人使用。

這基本上可以正常工作,但我經常會遇到一些異常,如下所示(有關完整的堆棧跟蹤,請參見帖子底部):

System.ServiceModel.CommunicationObjectAbortedException:對“ http://crm/MyOrganization/XRMServices/2011/Organization.svc ”的 HTTP 請求已中止。 這可能是由於在請求仍在進行中時本地通道已關閉。 如果不需要此行為,請更新您的代碼,使其在請求操作仍在進行中時不會關閉通道。

我的意思是每天大約 100 次,最常見的是每 5-30 分鍾以 3-6 個異常為一組拋出這些異常中的幾個。 我不知道為什么會這樣。 我在兩個服務中使用我的庫中的以下類初始化與 CRM 組織服務的連接:

public class CrmManager : IDisposable
{
    private static CrmConnection s_connection;
    public static CrmConnection Connection
    {
        get
        {
            if (s_connection == null)
            {
                s_connection = new CrmConnection("CrmTvTest");
            }
            return s_connection;
        }
    }

    public static IOrganizationService ServiceProxy
    {
        get { return s_serviceProxy ?? (s_serviceProxy = new CachedOrganizationService(Connection)); }
    }

可以看出,我為每個 WCF 服務連接到組織服務一次,使用CrmConnection來處理連接細節,該連接細節存儲在一個靜態變量中(作為單例,因為建立連接的成本很高,不應該這樣做經常以我的理解)。 然后它被傳遞給CachedOrganizationService ,出於同樣的原因,它是靜態的。 WCF 服務使用默認實例管理 ( PerSession AFAIK),這意味着每個用戶可能有 1 個連接和組織服務。

我的連接字符串看起來像這樣(當然,刪除了任何合理的數據):

<connectionStrings>
    <add name="CrmTvTest" connectionString="Url=http://crm/MyOrganization; Username=user; Password=pw;"/>

然后,我使用與CrmServiceContext對象的連接來使用 CrmManager 類中的此方法執行查詢。 當然,它總是在 using 語句中調用:

using (CrmServiceContext context = new CrmServiceContext(CrmManager.ServiceProxy))
{
    // do some stuff...
}

如何防止這些異常不斷發生? 我覺得這與 CRM 連接使用的安全令牌到期有關,但是當我使用CrmConnection類時,這應該不是問題。 它應該自動刷新它們。

任何建議都非常受歡迎,因為我現在正在考慮這個問題一段時間。


更新 1

我轉而使用Developer Extensions並使用 CrmConnector 類,但無濟於事(我更新了上面的代碼)。 我還嘗試將CrmConnection類直接傳遞給 CrmServiceContext:

using (CrmServiceContext context = new CrmServiceContext(CrmManager.Connection))

這導致了與此 Stackoverflow Question 中相同的問題,沒有使用負載平衡器(我們最初使用了,但禁用了負載平衡以消除它導致問題的可能性。


完整的堆棧跟蹤:

---> System.Net.WebException: 請求被中止:請求被取消。 在 System.Net.HttpWebRequest.GetResponse() 在 System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) --- 內部異常堆棧跟蹤結束---

服務器堆棧跟蹤:在 System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason) 在 System.ServiceModel.Channels.HttpChannelFactory 1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout) at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) at System.ServiceModel.Channels.SecurityChannelFactory 1.SecurityRequestChannel.Request(Message message, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

在 [0] 處重新拋出異常:在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) at Microsoft.Xrm 處的 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 處。 Sdk.IOrganizationService.Execute(OrganizationRequest request) at Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.ExecuteCore(OrganizationRequest request) at Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.Execute(OrganizationRequest request) at Microsoft.Xrm.Sdk.Linq。 QueryProvider.RetrieveEntityCollection(OrganizationRequest request, NavigationSource source) at Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute(QueryExpression qe, Boolean throwIfSequenceIsEmpty, Boolean throwIfSequenceNotSingle, Projection project, NavigationSource source, List 1 linkLookups, String& pagingCookie, Boolean& moreRecords) at Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute[TElement](QueryExpression qe, Boolean throwIfSequenceIsEmpty, Boolean throwIfSequenceNotSingle, Projection projection, NavigationSource source, List 1 linkLookups, String& pagingCookie, Boolean& moreRecords) at Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute[TElement](QueryExpression qe, Boolean throwIfSequenceIsEmpty, Boolean throwIfSequenceNotSingle, Projection projection, NavigationSource source, List在 Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute[TElement](表達式表達式)在 Microsoft.Xrm.Sdk.Linq.QueryProvider.System.Linq.IQueryProvider.Execute[TResult] 的1 linkLookups, String& pagingCookie, Boolean& moreRecords) at Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute[TElement](QueryExpression qe, Boolean throwIfSequenceIsEmpty, Boolean throwIfSequenceNotSingle, Projection projection, NavigationSource source, List 1 linkLookups) (表達式) at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 源) at CrmConnector.Entities.Contact.Get(Guid p_id, Boolean p_includeRelatedEntities) in j:\\IntDev\\Libraries\\CrmConnector\\Entities\\Contact。 cs:line 63 at CrmExtensionService.CrmExtension.GetPersonalizedEmailSignature(String p_contactId, String p_systemUserId) in j:\\IntDev\\Services\\CrmExtensionService\\CrmExtension.svc.cs:line 460

我們有同樣的問題,負載均衡器是罪魁禍首。 現在我們通過在負載均衡器中進行少量配置來解決此錯誤並激活負載均衡器。 我們在負載均衡器上啟用了使用最少連接算法的粘性會話。 因此,如果在負載平衡時未啟用此功能,則來自一台服務器的請求的經過身份驗證的連接將路由到不同的服務器,即使同一會話失敗。 一旦啟用粘性會話(會話持久性為客戶端 ip)請求將轉到同一服務器(在這種情況下返回連接而不是新連接),它運行良好。

因此,在擺弄了大約兩個月之后,我們發現了問題: CRM FrontEnd 的負載平衡是罪魁禍首。 我認為這也被禁用了,因為禁用了我們的 CRM 服務的負載平衡,但事實並非如此。 我們的 CRM 服務定期與服務器 1 的組織服務建立連接,然后在操作中切換到服務器 2,出現這些異常。

我們仍在嘗試弄清楚如何在激活負載平衡的情況下使其工作,但目前我們將其禁用以防止出現這些錯誤。

StackOverflow 上也有類似的案例: Soradic exceptions call a web service that is load balance 我們目前正在使用 webHttpBinding 並快速嘗試切換到 basicHttpBinding 但沒有讓它工作(但正如我所說,這只是一個快速嘗試)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM