WCF间歇性地超时

时间:2009-09-08 23:17:44

标签: asp.net wcf

所有

我有一个间歇性超时的WCF服务,通常是在来自asp.net客户端的大约十或十二个请求之后。该服务使用反射在其程序集(WAP dll)中查找具有自定义属性集的类。这个过程本身非常快,通常只需要几毫秒,当它工作时,它的工作效果很好。

在调用代码和服务本身中设置断点告诉我,在来自WCF客户端代理类的调用与实际执行该方法之间发生了超时。

想法?

更新:来自web.config的绑定等:

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Sdd.Services.ControlPanelBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="Sdd.Services.ControlPanelBehavior"
        name="Sdd.Services.ControlPanel">
        <endpoint address="" binding="wsHttpBinding" contract="Sdd.Services.IControlPanel">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>

更新:这是客户端web.config中的相关部分:

 <system.serviceModel>
  <bindings>
   <wsHttpBinding>
    <binding name="WSHttpBinding_IControlPanel" closeTimeout="00:01:00"
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
     bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
     maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
     textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
      maxBytesPerRead="4096" maxNameTableCharCount="16384" />
     <reliableSession ordered="true" inactivityTimeout="00:10:00"
      enabled="false" />
     <security mode="Message">
      <transport clientCredentialType="Windows" proxyCredentialType="None"
       realm="" />
      <message clientCredentialType="Windows" negotiateServiceCredential="true"
       algorithmSuite="Default" establishSecurityContext="true" />
     </security>
    </binding>
   </wsHttpBinding>
  </bindings>
  <client>
   <endpoint address="http://localhost:81/services/ControlPanel.svc"
    binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IControlPanel"
    contract="PublicSite.IControlPanel" name="WSHttpBinding_IControlPanel">
    <identity>
     <dns value="localhost" />
    </identity>
   </endpoint>
  </client>
 </system.serviceModel>

3 个答案:

答案 0 :(得分:4)

糟糕!

这可能是最愚蠢的错误,但我想出了问题:因为我习惯使用Web引用(.asmx web服务)而不是服务引用(WCF),我忽略了关闭代理对象。改变了

 [WebMethod]
    public static List<Page>PagesGetAll()
    {
        ControlPanelClient cp = new ControlPanelClient();
        Page[] pageArray = cp.NavigationPagesGetAll();
        List<Page> pageList = pageArray.ToList<Page>();

        // make sure that the page list in the database is up-to-date.
        foreach(Page page in pageList)
            Navigation.PageUpdate(page);

        return pageList;
    }

    public static List<Page>PagesGetAll()
    {
        List<Page> pageList = null;

        using (ControlPanelClient cp = new ControlPanelClient())
        {
            Page[] pageArray = cp.NavigationPagesGetAll();
            pageList = pageArray.ToList<Page>();
            // implied cp.Close() from "using" statement
        }

        // make sure that the page list in the database is up-to-date.
        foreach(Page page in pageList)
            Navigation.PageUpdate(page);

        return pageList;
    }

问题消失了。在验证此解决方案之后,我还增加了并发请求的数量,因为有超过10-12个并发请求会产生我之前看到的相同问题似乎是合乎逻辑的。

谢谢大家!

答案 1 :(得分:2)

帮助诊断此类问题的一种好方法是在client and the server上启用跟踪并使用Service Trace View Tool。这将使您更好地了解问题的确切位置(以何种方式或调用方式)。

答案 2 :(得分:0)

不幸的是,配置中最重要的部分(绑定和服务端点)丢失了 - 客户端配置也是如此。

但是你描述它的方式,10-12个请求似乎工作正常,然后出现故障,可能指向服务器上的并发/限制问题。

我会尝试增加并发调用和会话的数量,看看是否有帮助。为此,您需要在服务器上的行为配置中添加serviceThrottling部分:

<behavior name="Sdd.Services.ControlPanelBehavior">
   <serviceMetadata httpGetEnabled="true" />
   <serviceDebug includeExceptionDetailInFaults="false" />
   <serviceThrottling
      maxConcurrentCalls="25"          // default is 16
      maxConcurrentSessions="25"       // default is 10
      maxConcurrentInstances="25" />   // no default
</behavior>

如果这有帮助 - 您遇到了太多会话或打开并发呼叫的问题。 wsHttpBinding协议默认使用会话,所以你可能只需要告诉它使用每次调用。

马克