2010-10-28 62 views
0

我有一个很奇怪的问题。我有一个WCF服务和一个调用它的一些方法的控制台应用程序。在某个时候,它不能再调用其中的一个。它只是调用方法,但它永远不会输入。它只是在等待和等待......而没有发生任何事情。未调用WCF方法

我应该以某种方式刷新服务客户端吗?我试图创建一个新的服务客户端对象

QueryingServiceClient queryingClient = new QueryingServiceClient(); 

然后再次调用该方法,但它没有工作。只需补充一点,我会在停止工作之前多次调用该方法和其他几个方法。

任何想法?

谢谢。

+0

你怎么知道它没有进入的方法?调用代码卡住了还是会出错? – 2010-10-28 09:57:12

+0

我处于调试模式,我可以看到它永远不会进入该方法。我还在被调用的方法开始时放置了一个Console.Write,并且它不写任何东西(因为它从不被调用)。 – Ivan 2010-10-28 09:59:46

+0

我没有收到任何错误,只是卡住了。 – Ivan 2010-10-28 10:00:22

回答

1

假设:

  • 服务使用会话实例模式(默认模式)
  • 您的客户端为它对服务进行的每次调用创建一个新的代理实例。
  • 您的客户在呼叫后不会处理代理。

问题可能是您正在耗尽服务器上的可用插槽数(会话),以达到并发会话的最大数目。然后,您的客户端将根据定义的超时值等待,以便在服务端关闭会话(在这种情况下显然永远不会发生)。

建议的修复:

  • 将InstanceContextMode到PerCall,除非你真的需要WCF会话。
  • 使用后请务必关闭代理服务器。

编辑:

using (var proxy = new Proxy()) 
{ 
    // Use the proxy as much as needed 
    proxy.Method(); 
} 
+0

我试图把PerCall,但ID没有帮助。关于代理人,我不知道如何做到这一点..任何新手帮助? – Ivan 2010-10-28 12:00:56

+0

我编辑了我的答案。 – 2010-10-28 12:11:01

+0

它似乎有所帮助。谢谢! – Ivan 2010-10-28 12:21:35

0

它停止前的次数是否相同?也许你达到了连接限制?

您的WCF服务如何实例化?

Singleton,Session,PerCall?

您可以发布客户端和服务器端点的配置部分吗?

如果您使用WcfClient工具,它是否能够始终如一地工作?

+0

我在那里发布了我的回复,但我忘记提及它停止之前的次数并不总是相同。 – Ivan 2010-10-28 11:35:53

0

这很奇怪,它不会等待,并永远等待。你应该得到一个WCF超时异常。什么是您的app.config中的超时值?

如果您没有收到任何超时例外,那么可能是您没有拨打服务方式。我知道这很明显,但有时候名字很长的方法可能会彼此混淆。如果你也在调试客户端,那么你一定已经排除了这个问题。

0

感谢您的回复。

这不是永远的,我没有正确表达自己。经过一段时间后,我发现以下例外情况:

已超出最大重试计数,而远程端点没有响应。可靠的会话有问题。这通常表示远程终端不再可用。

这是一个单身人士。这是在app.config的一部分:

<system.serviceModel> 
    <bindings> 
      <wsHttpBinding> 
       <binding name="WSHttpBinding_QueryingService" closeTimeout="00:25:00" 
         openTimeout="00:25:00" receiveTimeout="00:25:00" sendTimeout="00:25:00" 
         bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
         maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647" 
         messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
         allowCookies="false"> 
         <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
          maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
          maxNameTableCharCount="2147483647" /> 
         <reliableSession ordered="true" inactivityTimeout="00:25:00" 
          enabled="true" /> 
         <security> 
          <transport> 
            <extendedProtectionPolicy policyEnforcement="Never" /> 
          </transport> 
         </security> 
       </binding> 
... 

在供应商方面:

<wsHttpBinding> 
    <binding name="wsHttpConfig" maxReceivedMessageSize="2147483647" receiveTimeout="00:25:00"> 
     <readerQuotas maxDepth="2147483647" 
        maxStringContentLength="2147483647" 
        maxArrayLength="2147483647" 
        maxBytesPerRead="2147483647" 
        maxNameTableCharCount="2147483647" /> 
     <reliableSession enabled="true" ordered="true" /> 
    </binding> 
    </wsHttpBinding> 

... 

<service name="Platform.WSLA.Impl.Services.Querying.QueryingService" 
      behaviorConfiguration="Default.Behavior"> 

    <endpoint address="http://localhost:8004/Platform/wsla/querying/QueryingService" 
       binding="wsHttpBinding" 
       bindingConfiguration="wsHttpConfig" 
       contract="Platform.WSLA.Contracts.Services.Querying.IQueryingService" /> 
    <endpoint address="mex" 
       binding="mexHttpBinding" 
       name="MetadataExchange" 
       contract="IMetadataExchange" /> 

    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8004/Platform/wsla/querying" /> 
     </baseAddresses> 
    </host> 

    </service> 
+0

听起来像你的服务摔倒了,然后没有回应。你有没有试过打开跟踪? http://blogs.msdn.com/b/madhuponduru/archive/2006/05/18/601458.aspx and http://geekswithblogs.net/mnf/archive/2008/10/03/use- wcf-message-logging.aspx – MattC 2010-10-28 11:48:18

+0

我开启了它,但没有多大帮助。 – Ivan 2010-10-28 12:12:46