Первый вызов веб-служб 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 сек!