2014-09-03 1 views
1

У меня возникла проблема с запуском службы WCF, которая подключается к CRM: она часто создает CommunicationObjectAbortedExceptions, которые оставляют меня зависеть от того, что я делаю что-то неправильно. Эти запуски начались после того, как многие люди начали его использовать, на тестовой системе он работал без проблем.Частые подключения прервали исключения при использовании службы управления CRM 2013

Но давайте начнем с начала: я написал две службы WCF, которые подключаются к службе организации Microsoft CRM2013, используя мою собственную библиотеку для выполнения запросов на CRM. Эти услуги регулярно вызывают из CRM, который ежедневно используется примерно 100-200 человек.

Это работает в основном хорошо, но я часто получаю несколько исключений, которые выглядят как следующее (см низ сообщений для полного StackTrace):

System.ServiceModel.CommunicationObjectAbortedException: запрос HTTP на 'http://crm/MyOrganization/XRMServices/2011/Organization.svc' был прерван. Это может быть связано с закрытием локального канала, пока запрос все еще продолжается. Если это поведение нежелательно, обновите код, чтобы он не закрывал канал, пока выполняются операции запроса.

Часто я имею в виду около 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 (CrmServiceContext context = new CrmServiceContext(CrmManager.ServiceProxy)) 
{ 
    // do some stuff... 
} 

Как я могу предотвратить постоянное появление этих исключений? Я чувствую, что это связано с токенами безопасности, используемыми соединением CRM, и это не должно быть проблемой, если я использую класс CrmConnection. Он должен обновлять их автоматически.

Любые советы были бы очень желанными, так как я обдумываю эту проблему какое-то время.


ОБНОВЛЕНИЕ 1

я перешел к использованию Developer Extensions и с помощью класса CrmConnector, но безрезультатно (я обновил приведенный выше код).Я также попытался прохождения CrmConnection класса непосредственно к CrmServiceContext:

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

, которая привела к тем же проблемам, как in this Stackoverflow Question, без использования балансировки нагрузки (мы изначально делали, но неработающая балансировку нагрузки, чтобы исключить возможность его вызывая проблемы


Полный StackTrace:.

---> System.Net.WebException: запрос был прерван: запрос был Канкуне eled. на System.Net.HttpWebRequest.GetResponse() в System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply (TimeSpan тайм-аута) --- Конец внутренней трассировки стека исключений ---

сервера трассировки стека: на System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException (WebException WebException, HttpWebRequest запрос, 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, TimeSpan таймаут) в системе. ServiceModel.Channels.ServiceChannel.Call (String action, Boolean oneway, ProxyOperationRuntime, Object [] ins, Object [] Диффузоры, TimeSpan тайм-аут) на System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall, эксплуатации ProxyOperationRuntime) на System.ServiceModel.Channels.ServiceChannelProxy.Invoke (Шеззаде сообщение)

Исключение при вызваны повторно [0]: на System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, Шеззаде retMsg) в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & msgData, типа Int32) в Microsoft.Xrm.Sdk.IOrganizationService. Выполнить (запрос OrganizationRequest) в Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.ExecuteCore (запрос OrganizationRequest) в Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.Execute (запрос OrganizationRequest) в Microsoft.Xrm.Sdk.Linq.QueryProvider.RetrieveEntityCollection (запрос OrganizationRequest, источник NavigationSource) в Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute (QueryExpression QE, булева throwIfSequenceIsEmpty, булева throwIfSequenceNotSingle, проекция проекции, источник NavigationSource, Список 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) на [TElement] (выражение Expression) Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute в Microsoft.Xrm.Sdk.Linq .QueryProvider.System.Linq.IQueryProvider.Execute [TResult] (выражение выражения) в System.Linq.Queryable.SingleOrDefault [TSource] (источник IQueryable1) в CrmConnector.Entities.Contact.Get (Guid p_id, Boolean p_includeRelatedEntities) в j: \ IntDe v \ Библиотеки \ CrmConnector \ Entities \ Contact.cs: строка 63 в CrmExtensionService.CrmExtension.GetPersonalizedEmailSignature (String, String p_contactId p_systemUserId) в J: \ IntDev \ Services \ CrmExtensionService \ CrmExtension.svc.cs: линия 460

+0

Я думаю, что у вас есть эта проблема, потому что вы поддерживаете соединения, и через некоторое время CRM сбрасывает их. Попытайтесь создать новое соединение для каждого использования, чтобы посмотреть, не исчезнет ли оно. –

+0

@ Pedro.The.Kid: только что попробовал, теперь я получаю несколько ошибок за минуту: «Безопасный канал не может быть открыт, поскольку согласование безопасности с удаленной конечной точкой не выполнено. (...) Запрос на токен безопасности неверен или искаженные элементы ". –

+0

Каковы ресурсы машины? Являются ли память/обработка около 100%? –

ответ

0

Итак, после прошивки около двух месяцев мы обнаружили проблему: Балансировка нагрузки CRM FrontEnd была виновницей. Я предположил, что это тоже было отключено с отключением балансировки нагрузки нашей службы CRM, но это не так. Наша CRM-служба периодически установила соединение с Службой организации сервера 1, а затем переключилась на сервер 2 в середине операции, и эти исключения произошли.

Мы по-прежнему пытаемся выяснить, как заставить это работать с балансировкой нагрузки активировано, но пока мы держим его отключенным, чтобы предотвратить появление этих ошибок.

В StackOverflow есть аналогичный случай: Sporadic exceptions calling a web service that is load balanced. В настоящее время мы используем webHttpBinding и быстро пытаемся перейти на basicHttpBinding, но не получили его на работу (но, как я уже сказал, это была просто попытка).