none
WCF外网调用延时严重。求助~ RRS feed

  • 问题

  • 我现在问题的情况是这样的:(WCF是4.0)
    我有一个WCF的服务,提供取任务(双工回调)、取影像、任务回退、任务提交等接口。客户端取到任务后取确认任务没问题后取任务影像,有问题回退任务、完成任务后提交任务,这些在客户端都是多线程操作的。每个客户端配置多个服务端端点(实现负载均衡和灾备)。 服务器同时开多个(2到4个)服务端(控制台程序)。通常客户端有几十到几百个(外网30~40个客户端,采用长连接的模式)。

    现在出现一种情况,外网通过端口直连服务端,经常出现客户端调用提交接口提交任务后几十秒服务端才收到提交消息(导致任务超时)。查看网络带宽并没有用完。而且内网的客户端调用服务端没有出现这种延时情况。

    查看过日志,客户端调完提交接口后很久服务端才进接口方法,这期间取任务接口还能正常取任务,但提交好像都堵在那。

    下面是服务端和客户端的配置信息:

    服务端配置:
    <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior name="EngineWCFService.TasksServiceBehavior">
              <serviceDebug includeExceptionDetailInFaults="true" />
              <serviceThrottling maxConcurrentCalls="100" maxConcurrentSessions="900" maxConcurrentInstances="1000" />
              <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8012" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <services>
          <service behaviorConfiguration="EngineWCFService.TasksServiceBehavior" name="EngineWCFService.TasksService">
            <endpoint address="net.tcp://localhost:8735" binding="netTcpBinding" bindingConfiguration="NewTcpBinding" name="NetTcpEndpoint" contract="EngineWCFService.ITasksService" />
            <host>
              <timeouts closeTimeout="00:01:50" openTimeout="00:01:50" />
            </host>
          </service>
        </services>
        <bindings>
          <netTcpBinding>
            <binding name="NewTcpBinding" closeTimeout="00:04:00" openTimeout="00:01:30" sendTimeout="00:02:00" maxBufferPoolSize="52428800" maxBufferSize="2147483647" maxConnections="5000" maxReceivedMessageSize="2147483647">
              <readerQuotas maxDepth="65536000" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="65536000" maxNameTableCharCount="2147483647" />
              <reliableSession enabled="false" />
              <security mode="None">
                <transport protectionLevel="None" />
              </security>
            </binding>
          </netTcpBinding>
        </bindings>
      </system.serviceModel>

    客户端配置:

    <system.serviceModel>
        <bindings>
            <netTcpBinding>
              <binding name="NetTcpEndpoint" closeTimeout="00:03:00" openTimeout="00:03:00"
                receiveTimeout="00:10:00" sendTimeout="00:03:00" transactionFlow="false"
                transferMode="Buffered" transactionProtocol="OleTransactions"
                hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="2147483647"
                maxBufferSize="2147483647" maxConnections="1000" maxReceivedMessageSize="2147483647">
                <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                  maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                  enabled="false" />
                <security mode="None">
                  <message algorithmSuite="Default" />
                </security>
              </binding>
            </netTcpBinding>
        </bindings>
        <client>
          <endpoint address="net.tcp://XX.XX.XX.XX:8735/" binding="netTcpBinding"
              bindingConfiguration="NetTcpEndpoint" contract="EngineWCFService.ITasksService"
              name="NetTcpEndpoint" />
        </client>
      </system.serviceModel>

    服务端服务:

        [ServiceContract(CallbackContract = typeof(ITaskCallback))]
        public interface ITasksService

    {

    ...

    public bool SubmitResult(TaskResult result)

    ...

    }

        [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple,UseSynchronizationContext =false)]
        public class TasksService : ITasksService

    {

    ...

            public bool SubmitResult(TaskResult result)
            {

    ...

            }

    }

    注: 其中TaskResult里包含一个XML文件,也不是特别大,加上一些参数。

    下面链接里有客户端TCP服务监控信息截图:
    http://q.cnblogs.com/q/77743/


    2015年12月2日 3:21

全部回复

  • 您好,

    我建议你可以从外网ping一下服务端,看看延时是多长时间。

    其次,如果多个客户端同时调用WCF 服务的时候,请考虑一下

    是不是有线程阻塞的问题。

    感谢您的支持。

    2015年12月3日 7:08
    版主