У меня возникла проблема с запуском службы 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
Я думаю, что у вас есть эта проблема, потому что вы поддерживаете соединения, и через некоторое время CRM сбрасывает их. Попытайтесь создать новое соединение для каждого использования, чтобы посмотреть, не исчезнет ли оно. –
@ Pedro.The.Kid: только что попробовал, теперь я получаю несколько ошибок за минуту: «Безопасный канал не может быть открыт, поскольку согласование безопасности с удаленной конечной точкой не выполнено. (...) Запрос на токен безопасности неверен или искаженные элементы ". –
Каковы ресурсы машины? Являются ли память/обработка около 100%? –