2010-10-28 45 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