Тайм-аут при отправке бизнес-объекта через функцию обратного вызова 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] атрибуты, за исключением, возможно, одной из строк, и заново вводите их по одному, пока не сломается.

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