代码之家  ›  专栏  ›  技术社区  ›  3Dave

WCF间歇超时

  •  0
  • 3Dave  · 技术社区  · 15 年前

    我有一个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>
    

     <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 回复  |  直到 15 年前
        1
  •  4
  •   3Dave    15 年前

    哎呀!

    关闭代理对象 . 改变

     [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个并发请求会产生与我以前看到的相同的问题,这似乎是合乎逻辑的。

    谢谢大家!

        2
  •  2
  •   JP Alioto    15 年前

    帮助诊断此类问题的一个好方法是在 client and the server 使用 Service Trace View Tool . 这将使您更好地了解问题的确切位置(在什么方法或调用中)。

        3
  •  0
  •   marc_s    15 年前

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

    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协议将使用会话,所以您可能只需要告诉它使用每次调用。

    马克