Соединение / Пул объектов для OrganizationServiceProxy в XRM / Dynamics CRM 2011 - PullRequest
2 голосов
/ 14 апреля 2011

Я пишу MVC 3 WebApp, в котором используется XRM 2011 с использованием Early Bound.Это интернет-приложение, размещенное на отдельном компьютере, чем Dynamics IIS.

Это, конечно, очень часто вызывает вызов OrganizationServiceProxy, и ответ на каждый первый удар выглядит медлительным.

Желательно ли повторно использовать подключение OrganizationServiceProxy вместо создания нового экземпляра каждый раз?

Если да,

  1. Есть ли что-нибудь для управления соединениями, например
    • приложение пула соединений - MS или стороннее / с открытым исходным кодом
    • или какая-либо инфраструктуракак WCF (пока еще не использовал WCF)
  2. Какой шаблон проектирования рекомендуется, если мне нужно написать собственный код для управления соединением?

Извините за дубликат сообщения с сайта MS.Надеюсь, этот форум более активный.

Ответы [ 3 ]

2 голосов
/ 07 июля 2011

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

CrmConnection connection = new CrmConnection("XrmConnectionString");   // Todo: Replace magic connection string
using (XrmVRC.XrmVrcServiceContext context = new XrmVRC.XrmVrcServiceContext(connection)) {
    // Processing...
}
1 голос
/ 09 мая 2012

Это довольно старый вопрос, но для всех, кто еще ищет, прочитайте это Расширения SDK для Microsoft Dynamics CRM 2011 и Microsoft Dynamics CRM Online . Я считаю, что расширения заботятся о кэшировании / пуле ресурсов для вас.

Для решения оригинального вопроса OP посмотрите здесь и здесь . Ниже приведена цитата из документации CRM SDK, ссылка на которую приведена выше:

Расширения разработчика для Microsoft Dynamics CRM предоставляют следующие возможности:

  • Упрощенное подключение к серверам Microsoft Dynamics CRM, предоставляемое классом CrmConnection (Microsoft.Xrm.Client)

  • Генерация кода для строгих типов, предоставляемая настройками для инструмента генерации кода (CrmSvcUtil.exe)

  • Конфигурируемость App.config и Web.config для включения пользовательских расширений, предоставляемых классом CrmConfigurationManager (Microsoft.Xrm.Client)

  • Повышение производительности за счет кэширования результатов обслуживания, предоставляемых классом CachedOrganizationService (Microsoft.Xrm.Client)

Руководство разработчика портала позволяет создать веб-портал, тесно интегрированный с Microsoft Dynamics CRM. Для получения дополнительной информации см. Руководство разработчика портала для Microsoft Dynamics CRM 2011 и Microsoft Dynamics CRM Online. Это руководство подтверждает следующие возможности:

  • Управление безопасностью (Microsoft.Xrm.Portal)

  • Управление кэшем (Microsoft.Xrm.Portal)

  • Управление контентом (Microsoft.Xrm.Portal, Microsoft.Xrm.Portal.Files, WebSiteCopy.exe)

0 голосов
/ 24 июня 2011

Я также разместил этот вопрос на MS Forum , где я получил следующий ответ от Пат.

While it is somewhat limited, there is some direction regarding the caching of service connectivity in the SDK:

Performance Best Practises - Caching

The two primary suggestions being to:

    1. Cache the IServiceConfiguration class
    2. Monitor your WCF security token and refresh it before it expires 

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

Что касается управления AppPool, я все еще ищу информацию.


1. ManagedTokenOrganizationServiceProxy
2. AutoRefreshSecurityToken
3. DeviceIdManager

Я добавил следующую строку подключения в web.config

<add name="XrmConnectionString" connectionString="ServiceUri=http://<MACHINE>:<PORTt>/<ORG>/XRMServices/2011/Organization.svc; Domain=<DOMAIN>; Username=<USERNAME>; Password=<PASSWORD>" />

Затем я создал следующий класс для создания соединения.

/// <summary>Provides server connection information.</summary>
public class ServerConnection
{
    private static readonly ILog log = LogManager.GetLogger(typeof(ServerConnection));

    #region Public methods
    /// <summary>
    /// Obtains the OrganizationServiceProxy connection for the target organization's
    /// Uri and user login credentials from theconfiguration.
    /// </summary>
    public static OrganizationServiceProxy getServiceProxy() {
        ManagedTokenOrganizationServiceProxy serviceProxy = null;
        log.Debug("in getServiceProxy");
        try {
            CrmConnection crmConnection = new CrmConnection("XrmConnectionString");
            serviceProxy = new ManagedTokenOrganizationServiceProxy(crmConnection.ServiceUri, crmConnection.ClientCredentials);
            log.Debug("ManagedTokenOrganizationServiceProxy created = " + serviceProxy);
            serviceProxy.EnableProxyTypes();
        } catch (Exception e) {
            log.Fatal(e, e);
            throw;
        }
        log.Debug("Returning serviceProxy");
        return serviceProxy;
    }

    #endregion
}

Следующий код MVC использует соединение:

public ActionResult Index() {
    XrmVrcServiceContext context = null;
    try {
        context = new XrmVrcServiceContext(ServerConnection.getServiceProxy());
    } catch (Exception e) {
        log.Error(e, e);
        throw;
    }
    return View(context.new_XYZEntitySet.ToList());
}
...