Тайм-аут при отправке бизнес-объекта через функцию обратного вызова WCF
У меня есть служба WCF с контрактом обратного вызова, через который я пытаюсь отправить бизнес-объект. У меня есть бизнес-объект, украшенный атрибутами DataContract() и DataMember(), и он содержит следующее количество свойств:
- целых 3
- строки: 4
- XElement: 1
- другие объекты: 5 (также украшенные DataContract() и DataMember()
Всякий раз, когда я пытаюсь отправить этот объект через обратный вызов, время ожидания службы истекает. Я попытался создать другие объекты с меньшим количеством свойств для отправки через обратный вызов, и могу заставить его пройти, если есть только одно свойство, но если у меня есть больше чем одно свойство, время ожидания службы.
Что-то не так в моей конфигурации? Я попробовал wsDualHttpBinding по умолчанию, а также customBinding (как показано ниже), и я попробовал все виды различных настроек с maxBufferSize, maxBufferPoolSize и maxReceivedMessageSize. Я не хочу увеличивать время ожидания, так как я хотел бы, чтобы этот объект прибыл к моему клиенту довольно быстро. Пожалуйста, кто-нибудь, помогите мне... если бы у меня остались волосы, я бы их сейчас вытащил!!!!!
Я настроил свой сервис как таковой:
Конфигурация сервера:
<customBinding>
<binding name="DualBindingConfig">
<reliableSession flowControlEnabled="true" maxPendingChannels="128" />
<compositeDuplex />
<oneWay/>
<binaryMessageEncoding/>
<httpTransport maxReceivedMessageSize="655360000" maxBufferPoolSize="655360000" />
</binding>
</customBinding>
<services>
<service behaviorConfiguration="Agent_Utility_WCF.Callback.AgentMessagingBehavior"
name="Agent_Utility_WCF.Callback.AgentMessaging">
<endpoint address="" binding="customBinding" bindingConfiguration="DualBindingConfig" bindingName="AgentMessaging" contract="Agent_Utility_WCF.Callback.IAgentMessaging">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="Agent_Utility_WCF.Callback.AgentMessagingBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceThrottling maxConcurrentCalls="160" maxConcurrentSessions="100"/>
</behavior>
</serviceBehaviors>
</behaviors>
Конфигурация клиента:
<bindings>
<customBinding>
<binding name="AgentMessaging_IAgentMessaging">
<reliableSession acknowledgementInterval="00:00:00.2000000" flowControlEnabled="true"
inactivityTimeout="00:10:00" maxPendingChannels="4" maxRetryCount="8"
maxTransferWindowSize="8" ordered="true" reliableMessagingVersion="Default" />
<compositeDuplex />
<oneWay maxAcceptedChannels="10" packetRoutable="false">
<channelPoolSettings idleTimeout="00:02:00" leaseTimeout="00:10:00"
maxOutboundChannelsPerEndpoint="10" />
</oneWay>
<binaryMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
maxSessionSize="2048">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binaryMessageEncoding>
<httpTransport manualAddressing="false" maxBufferPoolSize="524288"
maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
keepAliveEnabled="true" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous"
realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
useDefaultWebProxy="true" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="http://localhost:666/Callback/AgentMessaging.svc"
binding="customBinding" bindingConfiguration="AgentMessaging_IAgentMessaging"
contract="AgentMessaging.IAgentMessaging" name="AgentMessaging_IAgentMessaging">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
3 ответа
Добавьте следующее в ваш web.config:
<system.diagnostics>
<trace autoflush="true">
<listeners>
</listeners>
</trace>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="sdt"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "WcfDetailTrace.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
Затем вызовите ваш метод веб-службы. Это сгенерирует WcfDetailTrace.svclog в корне вашего веб-сайта. Откройте этот файл с помощью SvcTraceViewer.exe. Это должно дать вам довольно много информации о том, что происходит.
Насколько велики другие объекты? Например, насколько велика XElement
поддерево? График для объекта может в конечном итоге стать довольно большим, особенно если он вызывает другие объекты.
Простой следственный подход может заключаться в удалении [DataMember]
атрибуты, за исключением, возможно, одной из строк, и заново вводите их по одному, пока не сломается.
Я хотел бы взглянуть на http://smehrozalam.wordpress.com/2009/01/29/retrieving-huge-amount-of-data-from-wcf-service-in-silverlight-application/.