Первый вызов веб-служб Dynamics GP 2010 занимает более 10 секунд

У меня есть веб-сайт, который общается с веб-службами.NET 4 WCF. Эта служба WCF подключается к веб-службам Dynamics GP на удаленном сервере. Обе веб-службы размещаются самостоятельно (без IIS).

Первый звонок в GP занимает около 12 секунд! Звонки сразу после (даже в другом запросе WCF) составляют около 100 мс, но если я подожду минуту или две между вызовами, это займет еще 10 секунд...

В чем может быть причина проблемы, как я могу решить ее?

Я сгенерировал прокси, используя и SvcUtil, и VS 2010 Add Service Reference, но получил ту же проблему с обоими. Файл прокси-сервера Dynamics GP занимает 3 МБ, не знаю, связано ли это.

Я запустил Wireshark для анализа сетевого трафика, и реальный поток запросов-ответов tcp, похоже, занимает меньше секунды. Кажется, перед отправкой запроса происходит что-то, что занимает 10 секунд.

Вот код, используемый:

Context context = new Context();
CompanyKey companyKey = new CompanyKey();
companyKey.Id = -1;
context.OrganizationKey = companyKey;

System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();

_proxy = new DynamicsGPClient();
_proxy.ClientCredentials.Windows.ClientCredential.Domain = Domain;
_proxy.ClientCredentials.Windows.ClientCredential.UserName = Username;
_proxy.ClientCredentials.Windows.ClientCredential.Password = Password;

long openingMs = sw.ElapsedMilliseconds;
CustomerCriteria customerCriteria = new CustomerCriteria();
CustomerSummary[] gpCustomers = _proxy.GetCustomerList(customerCriteria, context);
long fctCallMs = sw.ElapsedMilliseconds;
...
if (_proxy != null && _proxy.State != System.ServiceModel.CommunicationState.Faulted) {
    _proxy.Close();
}

Вот app.config:

<system.serviceModel>
   <bindings>
      <wsHttpBinding>
         <binding name="GPWebService" closeTimeout="00:01:00" openTimeout="00:01:00"
                  receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" 
                  transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
                  maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
                  messageEncoding="Text" textEncoding="utf-8" 
                  useDefaultWebProxy="true" allowCookies="false">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
                          maxBytesPerRead="4096" maxNameTableCharCount="2147483647"/>
            <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
            <security mode="Message">
               <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>
               <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default"/>
            </security>
         </binding>
      </wsHttpBinding>
   </bindings>
   <client>
      <endpoint address="http://192.168.x.y:48620/Dynamics/GPService/GPService" binding="wsHttpBinding"
                bindingConfiguration="GPWebService"
                contract="DynamicsGpService.DynamicsGP" name="GPWebService">
         <identity>
            <userPrincipalName value="DEV\gpeconnect"/>
         </identity>
      </endpoint>
   </client>
</system.serviceModel>

1 ответ

Решение

Самостоятельный ответ

Для сообщества вот что я узнал (но я не могу объяснить почему, поэтому не спрашивайте!;))

В app.config клиента, useDefaultWebProxy="true" должен быть установлен в false... это сделало очень простой переход Hello World Web Service с 7 секунд до ~100 мсек при первом вызове.

В app.config клиента, полностью удалив identity > userPrincipalName раздел заставил первый вызов WCF пройти от> 10 сек до ~ 1 сек!

Другие вопросы по тегам