WCF性能:与WCF服务的连接需要很长时间

时间:2013-03-13 04:59:21

标签: c# .net performance wcf entity-framework

我的服务器上的IIS 7.5上托管了WCF服务。我在我的服务中使用了Entity framework 5.0。

当我通过在站点中添加服务引用和创建客户端从本地系统调用该服务时,需要大约40秒才能获得响应。我尝试在本地调用相同的服务,这里只需3-4秒。

将服务器上的服务引用添加到本地系统上的站点后,web config中添加的绑定和端点如下所示:

<binding name="WSHttpBinding_IMyWCFService" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:50:00" sendTimeout="00:01:00"
          bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
          maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
          messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
          allowCookies="false">
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
            maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00"
            enabled="false" />
          <security mode="Transport">
            <transport clientCredentialType="None" proxyCredentialType="None"
              realm="" />
            <message clientCredentialType="Windows" negotiateServiceCredential="true" />
          </security>
        </binding>




<endpoint address="https://<url>/MyWCFService.svc/soap"
        binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IMyWCFService"
        contract="MerchantService.IMyWCFService" name="WSHttpBinding_IMyWCFService" />

首先我认为这是Entity框架的问题。但后来我使用Entity framework profiler检查了该方法的执行时间。它几乎不需要1秒钟。

当我调用该服务时,它需要添加一个标题,我正在添加。

所以,这需要40秒的时间。它不是慢启动或只是第一次花时间。它总是花费这么多时间。

网络速度是否可能导致此延迟。如果是,可以达到什么程度?

该服务返回列表List。这可能是一个问题,我们不应该返回列表。有什么可以替代?

此外,每次请求到来以及数据库连接是否花费时间时,Entity框架是否与DB建立连接。可以吗?

请帮忙。 感谢

3 个答案:

答案 0 :(得分:1)

首先我使用Code第一种方法。为了提高性能,我尝试预先生成视图,以便第一次生成视图的开销可以减少。但我认为这些观点不起作用。 所以,我尝试切换到Database First方法然后生成视图并将该构建上传到远程服务器。现在时间从40秒减少到10秒。我也尝试在WCF服务启动时打开数据库连接。它再次将时间缩短为5秒。

答案 1 :(得分:0)

我建议逐步隔离问题

1)要了解网络带宽是否是问题,只需托管一个简单的服务,返回一些简单的值,如整数或字符串,并检查其响应时间。

2)如果步骤1中的响应时间大大改善,那么请查看数据库或列表问题。

答案 2 :(得分:0)

我怀疑你的问题是凭证谈判。有一种简单的方法可以验证这一点,只需在没有安全性的同一台服务器上运行服务(如果允许的话)。

一种可能的补救措施是通过将negotiateServiceCredential属性设置为false来消除SOAP凭据协商。您需要首先确保为您的域启用了Kerberos。