1

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

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

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

<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" />

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

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

所以,它需要 40 秒的时间。而且它的启动速度并不慢,也不是第一次花时间。总是需要这么多时间。

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

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

此外,实体框架是否会在每次请求到来时以及数据库连接是否需要时间时建立与数据库的连接。有可能吗?

请帮忙。谢谢

4

3 回答 3

1

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

于 2013-03-14T04:52:04.237 回答
0

我建议逐步隔离问题

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

2) 如果步骤 1 中的响应时间显着提高,则查看数据库或列表问题。

于 2013-03-13T05:15:22.673 回答
0

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

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

于 2013-03-13T05:22:54.843 回答