FetchXml System.OutOfMemory Exception

Как я узнал из поисков в Google, MSCRM 2011 извлекает максимум 5000 объектов, но я хочу, чтобы все мои объекты были из маркетингового списка. Как написано в Интернете, создание поля "TurnOffFetchThrottling" в HKLM\Software\Microsoft\MSCRM и установка значения равным 1 может решить эту проблему ограничения 5000 (Кроме того, я добавил поле MaxRowsPerPage в реестр и установил его значения более 5000, но это также не работает). Я попытался, и я получил ошибку исключения System.OutOfMemory. Кстати, когда я удаляю "" и просто получаю идентификатор атрибута, код работает отлично, но мне нужны все атрибуты. Вот мой код fetchxml:

enter code here
string fetchXml = "<fetch mapping='logical' >"
                  + "<entity name='" + entityType.LogicalName + "'>"
                    + "<all-attributes />"
                    + "<link-entity name='listmember' to='" + entityType.LogicalName + "id" + "' from='entityid'>"
                        + "<filter>"
                          + "<condition attribute='listid' operator='eq' value='" + chosenMarketingListGuid + "'/>"
                        + "</filter>"
                    + "</link-entity>"
                  + "</entity>"
                + "</fetch>";

Я попробовал еще одну вещь, я изменил fetchxml как:

enter code here
string fetchXml = "<fetch mapping='logical' >"
                  + "<entity name='listmember'>"
                    + "<all-attributes />"
                        + "<filter>"
                          + "<condition attribute='listid' operator='eq' value='" + chosenMarketingListGuid + "'/>"
                        + "</filter>"
                  + "</entity>"
                + "</fetch>";

Как видно, я попытался получить только списки участников вместо типов контактов / лидов / учетных записей, и это работает! Как бы то ни было, мне нужны типы контактных / ведущих / учетных записей, а не список участников. Я буду очень благодарен, если кто-нибудь поможет мне выбраться из этого темного туннеля MSCRM!

здесь полная трассировка стека:

[OutOfMemoryException: было сгенерировано исключение типа 'System.OutOfMemoryException'.] System.ServiceModel.Security.SecurityUtils.ReadContentAsBase64(читатель XmlDictionaryReader, Int64 maxBufferSize) +197 System.ServiceModel.SryictionaryD 17 System.ServiceModel.Security.EncryptedType.ReadFrom(XmlDictionaryReader читатель, Int64 MaxBufferSize) +858 System.ServiceModel.Security.WSSecurityOneDotZeroReceiveSecurityHeader.DecryptBody(XmlDictionaryReader bodyContentReader, SecurityToken маркер) +80 System.ServiceModel.Security.WSSecurityOneDotZeroReceiveSecurityHeader.ExecuteMessageProtectionPass(Boolean hasAtLeastOneSupportingTokenExpectedToBeSigned) +1611 System.ServiceModel.Security.ReceiveSecurityHeader.Process(Тайм-аут TimeSpan, ChannelBinding channelBinding, ExtendedProtectionPolicy extendedProtectionPolicy) +1576 System.ServiceModel.Security.MessageSecurityProtocol.ProcessSecurityHeader security (ReceiveSecurityHeader) дер, сообщение и сообщение, SecurityToken requiredSigningToken, TimeSpan таймаут, SecurityProtocolCorrelationState[] correlationStates) +205 System.ServiceModel.Security.SymmetricSecurityProtocol.VerifyIncomingMessageCore(Message& сообщение, String актер, TimeSpan таймаут, SecurityProtocolCorrelationState[] correlationStates) +637 System.ServiceModel.Security.MessageSecurityProtocol.VerifyIncomingMessage(Message& сообщение, TimeSpan таймаут, SecurityProtocolCorrelationState[] correlationStates) +371 System.ServiceModel.Channels.SecurityRequestChannel.ProcessReply(ответное сообщение, SecurityProtocolCorrelationState correlationState, TimeSpan таймаут) +471 System.ServiceModel.Channels.SecurityRequestChannel.Request(сообщение сообщения, TimeSpan timeout) +175 System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Сообщение сообщения, TimeSpan timeout) +22 System.ServiceModel.Channels.ServiceChannel.Call(Строковое действие, логический oneway, операция ProxyOperationRuntime, Object[] ins, Object[] ] ауты, TimeSpan тайм-аут) +517 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(операция IMethodCallMessageCall, операция ProxyOperationRuntime) +88 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(сообщение IMessage. Message_Reader.Relay.Revice.Revo.Revo.Revice.Run.Revice.Revo.Revice.Run.Revice.Relay.Revice.Reader.Revice.Reader.Reader.Reader.Reader.Reader.Reader.Reader.Reader.Reader.Reader.Reader.Ru.Ru.Ru.Service.Ru.Ru.Ru.Serv. Reader).Ress.Ru.Serv. msgData, тип Int32) +237 Microsoft.Xrm.Sdk.IOrganizationService.RetrieveMultiple(запрос QueryBase) +0 Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.RetrieveMultipleCore(запрос QueryBase) +626 Microsoft.Xrli.Service.Revice.Revice.Service.Service.Service.Service.Play (Запрос QueryBase) +39 IMPlugin.MarketingListHelper.getMembersAndCountOfChosenMarketingList(служба OrganizationServiceProxy, выбранный GuidMarketingListGuid, Entity entityType) в C:\Users\Zafer\Documents\Visual Studio 2010\Projects\IMPlugin\MarketingListF. Удвойте mainPanelHeight) в C:\Users\Zafer\Documents\Visual Studio 2010\Projects\IMPlugin\IM_SMS.aspx.cs:96 IMPlugin.IM_SMS.Page_Load(Отправитель объекта, EventArgs e) в C:\Users\Zafer\Documents\Visual Studio 2010\Projects\IMPlugin\IM_SMS.aspx.cs:42 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(отправитель объекта, EventArgs e) +35 System.Web.UI.Control.OnLoad(EventArgs e) +91 System.Web.UI.Control.LoadRecursive() +74 System.Web.UI.Page.ProcessRequestMain(логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint) +2207

1 ответ

Решение

Причина, по которой существует ограничение в 5000, является грубым барьером для точного предотвращения проблемы, с которой вы столкнулись. Вы обошли ограничение программного обеспечения, теперь вам нужно преодолеть аппаратное ограничение (нехватка памяти)...

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

Грубый пример:

// get records to process
string pagingCookie = null;
bool moreRecords = false;
int pageNum = 1;
DataCollection<Entity> myBatchOfRecords;    

bool continueProcessing = true;
while (continueProcessing)
{
    myBatchOfRecords = GetRecords(pageNum, ref pagingCookie, ref moreRecords);

    // process those records
    ProcessRecords(myBatchOfRecords);
    pageNum++;    
    continueProcessing = moreRecords;
}

function DataCollection<Entity> GetRecordsList(int pageNumber, ref string pagingCookie, ref bool moreRecords){
    var query = new QueryExpression(blahblahblah...);
    query.PageInfo = new PagingInfo { 
        Count = 5000, 
        PageNumber = pageNumber, 
        PagingCookie = pagingCookie };
    var results =  myOrgService.RetrieveMultiple(query);
    pagingCookie = matchedContacts.PagingCookie;
    moreRecords = matchedContacts.MoreRecords;
    return results;
}
Другие вопросы по тегам