AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.05.2008, 17:08   #1  
Черничкин Станислав is offline
Черничкин Станислав
Злыдни
Аватар для Черничкин Станислав
Злыдни
 
53 / 18 (1) ++
Регистрация: 16.10.2007
Адрес: Екатеринбург
Использование WCF для подключения к службам CRM.
В этом посте содержится описание некоторых проблем, которые могут возникнуть при подключении к службам CRM с помощью WCF, и способов их решения. Надеюсь, это поможет Вам сэкономить время.

1. Когда использовать WCF.
Для обращения к службам MS CRM можно использовать стандартный WEB клиент FW 2.0. В большинстве случаев так и следует делать. Но у стандартного клиента есть серьезные ограничения по конфигурированию (единственный параметр, который он считывает из файла конфигурации – это адрес службы). Таким образом, чтобы иметь возможность конфигурировать клиента, необходимо либо создать фабрику клиентов, которая будет настраивать свойства создаваемых клиентов, либо использовать WCF, который уже имеет очень богатые возможности конфигурации. Еще WCF позволяет более тонко генерировать прокси классы (например, использовать листы вместо массивов), но лично у меня необходимости в этом пока не возникало.

2. Где грабли.
Основное преимущество WCF – богатые возможности настройки – одновременно являются его основным недостатком. Если Вы просто импортируете службу CRM без дополнительных настроек, скорее всего, она не заработает. А по сообщениям об ошибке будет очень сложно понять, что именно не работает и как это исправить.

3. Пример конфигурации.
Ниже приведен рабочий пример конфигурации клиента WCF для развертывания c AD аутентификацией (наиболее типичный случай для России):

Код:
<system.serviceModel>
<diagnostics>
 <messageLogging logEntireMessage="true"
  logMalformedMessages="true"
  logMessagesAtServiceLevel="false"
  logMessagesAtTransportLevel="true" />
</diagnostics>
<bindings>
 <basicHttpBinding>
  <binding name="crmWebServiceBinding"
   closeTimeout="00:01:00"
   openTimeout="00:01:00"
   receiveTimeout="00:10:00"
   sendTimeout="00:01:00"
   allowCookies="false"
   bypassProxyOnLocal="false"
   hostNameComparisonMode="StrongWildcard"
   maxBufferSize="16777216"
   maxBufferPoolSize="67108864"
   maxReceivedMessageSize="16777216"
   messageEncoding="Text"
   textEncoding="utf-8"
   transferMode="Buffered"
   useDefaultWebProxy="true">
   <readerQuotas maxDepth="32"
      maxStringContentLength="8388608"
      maxArrayLength="16384"
      maxBytesPerRead="4096"
      maxNameTableCharCount="8388608" />
   <security mode="TransportCredentialOnly">
    <transport clientCredentialType="Windows"
         proxyCredentialType="None"
         realm="" />
    <message clientCredentialType="UserName"
       algorithmSuite="Default" />
   </security>
  </binding>
 </basicHttpBinding>
</bindings>
<client>
 <endpoint address="http://silo.crm3.local:5555/mscrmser...ryservice.asmx"
   behaviorConfiguration="developmentBehavior"
   binding="basicHttpBinding"
   bindingConfiguration="crmWebServiceBinding"
   contract="MsCrm.Discovery.CrmDiscoveryServiceSoap"
   name="CrmDiscoveryServiceSoap" />
 <endpoint address="http://silo.crm3.local:5555/mscrmser...taservice.asmx"
   behaviorConfiguration="developmentBehavior"
   binding="basicHttpBinding"
   bindingConfiguration="crmWebServiceBinding"
   contract="MsCrm.Metadata.MetadataServiceSoap"
   name="MetadataServiceSoap" />
 <endpoint address="http://silo:5555/MSCrmServices/2007/CrmService.asmx"
   behaviorConfiguration="developmentBehavior"
   binding="basicHttpBinding"
   bindingConfiguration="crmWebServiceBinding"
   contract="MsCrm.CrmServiceSoap"
   name="CrmServiceSoap" />
</client>
<behaviors>
 <endpointBehaviors>
  <behavior name="developmentBehavior">
   <clientCredentials>
    <windows allowedImpersonationLevel="Impersonation"/>
   </clientCredentials>
   <!-- остальные поведенческие аспекты удалены -->
  </behavior>
 </endpointBehaviors>
</behaviors>
<extensions>
 <behaviorExtensions>
  <!-- расширения поведенческих аспектов удалены -->
 </behaviorExtensions>
</extensions>
</system.serviceModel>
Он почти не отличается от автоматически генерируемого файла, и мало чем будет отличаться от Вашей конфигурации.
Приведенный файл конфигурации содержит 3 конечных точки для подключения к 3-м службам CRM, единый описания блок привязки для этих точек, блоки с поведенческими аспектами и расширениями (которые я стер, т.к. они использовались для моих личных задач), а также блок диагностики, который включает логгирование запросов к службам. Естественно, адреса служб, и названия контрактов у Вас будут свои.
Прежде всего, следует обратить внимание на поведенческий аспект, который разрешает заимствование прав (<windows allowedImpersonationLevel="Impersonation"/>). Дело в том, что по умолчанию разрешена только идентификация, и, в принципе, этого достаточно для работы CrmDiscoveryService, но службы CrmService и MetadataService в случае AD аутентификации используют заимствование прав.
Режим безопасности TransportCredentialOnly с clientCredentialType="Windows" выглядят вполне естественно, но по умолчанию там тоже другие значения которые нужно не забыть поменять. Кстати, если используется прокси-сервер, который требует авторизации, Вам также придется указать proxyCredentialType.
Самое забавное в настройке CRM клиента, это размеры его буферов. Дело в том, что MetadataService склонна возвращать большие объёмы данных, поэтому надо позаботиться о том, чтобы мы могли их принять. Я выбрал maxBufferSize="16777216" maxBufferPoolSize="67108864" maxReceivedMessageSize="16777216".
maxStringContentLength ограничивает максимальную длину строки, возвращаемую XmlDictionaryReader-ом. По умолчанию там 8k символов, что делает невозможным вызов методов, возвращающих длинные строки (например ExportAllXml). И, наконец, размер таблицы имён XmlDictionaryReader-а (maxNameTableCharCount="8388608"). Дело в том, что если мы вызовем, скажем, ExportCompressedAllXml назад к нам прилетит xml документ с двумегабайтной строкой, которую XmlDictionaryReader попытается поместить в свою таблицу имён. Если там не будет достаточно места, десериализация провалится.

4. Особенности вызовов методов.
В отличие от стандартного клиента, WCF требует явной передачи SOAP заголовков при вызове методов. И в некоторых случаях передавать не пустые заголовки обязательно. В частности, всегда требуется передавать CrmAuthenticationToken с названием организации. Причем если Вы забудете это сделать, программа выдаст исключение «Запрос HTTP не разрешен для схемы проверки подлинности клиента "Negotiate". От сервера получен заголовок проверки подлинности "Negotiate,NTLM"» из которого не легко будет сделать выводы о характере ошибки. Также следует передавать CorrelationToken, иначе Вы получите сообщение о внутренней ошибке сервера (правда при включенной трассировке на стороне сервера, Вы быстро поймете, в чем дело). Для создания токенов можно использовать вспомогательные классы, которые входят в состав SDK.

5. Ссылки по теме.
Включение трассировки в CRM: http://support.microsoft.com/kb/907490 (русская статья устарела, для получения сведений по CRM 4.0 переключитесь на английский язык).
Утилита для просмотра лога WCF: C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\SvcTraceViewer.exe (устанавливается вместе с VS 2008 либо Windows SDK)

Последний раз редактировалось Черничкин Станислав; 08.05.2008 в 18:57. Причина: Нашел очередную ошибку в конфигурации.
За это сообщение автора поблагодарили: mistah (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Microsoft Dynamics CRM Team Blog: Building Rich-Client Dashboards for Microsoft Dynamics CRM with Windows Presentation Foundation Blog bot Dynamics CRM: Blogs 1 31.03.2009 13:24
Microsoft Dynamics CRM Team Blog: List Web Part for Microsoft Dynamics CRM 4.0 Deployment Scenarios Blog bot Dynamics CRM: Blogs 0 30.01.2009 22:05
Microsoft Dynamics CRM Team Blog: Microsoft Dynamics CRM 4.0 Bookshelf Blog bot Dynamics CRM: Blogs 1 22.01.2009 04:46
Microsoft Dynamics CRM Team Blog: Reports for CRM 4.0 using SQL Server 2008 and Report Builder 2.0 Blog bot Dynamics CRM: Blogs 0 11.11.2008 08:05
Microsoft Dynamics CRM Team Blog: Top 14 Microsoft Dynamics CRM Sites and Downloads Blog bot Dynamics CRM: Blogs 0 14.07.2008 13:05

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 11:45.