2009-10-09 36 views
1

這是我第一次嘗試使用WCF,所以這種方法可能有些根本錯誤 - 如果是這樣的話,我很樂意切換到另一種模式。乍一看,我認爲this question的答案可以奏效,但我的情況似乎有所不同。爲什麼在IIS中託管的WCF Web服務會隨機停止響應?

我有一個ASP.NET MVC網站,控制器通過中間存儲庫訪問WCF客戶端類。該存儲庫只是WCF客戶端的一個包裝器,它將其實例化一次並設置適當的端點地址。

public class WcfRepository : IRepository 
{ 
    private MyWCFServiceClient client; 

    public WcfRepository() 
    { 
     client = new MyWCFServiceClient(); 
    } 

    public bool MyMethod1() 
    { 
     return client.MyMethod1(); 
    } 

    ... etc  
} 

我可以訪問網站上的不同頁面,直到WCF服務開始超時的看似隨機的點。我調用哪種方法並不重要 - 它在不同的方法上超時。我在託管WCF服務的IIS計算機上也看不到任何異常;事件日誌有空。一個簡單的方法,如GetCustomerByName()兩分鐘之前的工作將不再,所以我認爲它更多的是與WCF通信,而不是服務本身。

如果我嘗試在發生這些超時之一時使用WCF測試客戶端,它也會失敗。但是,如果我等一會兒(並選擇'開始一個新的代理'),那麼事情會再次起作用。

我很困惑 - 我應該創建一個新的WCF客戶端實例,每次我想在我的資源庫中使用它?我應該使用客戶端的另一種方式嗎?由於第一次致電Close()將對象置於處置狀態,因此將Open()/Close()中的每個呼叫包裝都不起作用。

+0

我懷疑它是WCF - 更可能的是,它是IIS和ASP.NET應用程序池阻止你的通信。 IIS託管WCF是一個.....次優解決方案 - 我總是託管WCF服務在我自己的NT服務或控制檯應用程序。 –

+0

我有點困惑。您的MVC應用程序是否使用託管在另一個IIS實例中的WCF服務? –

+0

marc_s你有任何關於爲什麼在IIS中託管WCF的更多信息不理想嗎?我們必須在客戶端部署此服務,讓他們同意的最簡單方法似乎是在IIS中託管。 – Jedidja

回答

2

當你完成你的WCF客戶端時,你必須明確地關閉它,否則它會保持一個'連接'對服務開放,並且你可以有多少個併發連接有一個(可配置的)限制。

儘管可以調整該限制,但正確的解決方案是創建一個新的WCF客戶端,調用一個或多個方法並在完成後再次關閉它。這被認爲是最佳實踐,應該整潔地避免你目前遇到的種種問題。

這意味着你的實現應該寧願是這樣的:

public class WcfRepository : IRepository 
{ 
    public bool MyMethod1() 
    { 
     var client = new MyWCFServiceClient(); 
     try 
     { 
      return client.MyMethod1(); 
     } 
     finally 
     { 
      try 
      { 
       client.Close(); 
      } 
      catch(CommunicationException) 
      { 
       // handle exception here 
      } 
      catch(TimeoutException) 
      { 
       // handle exception here 
      } 

     } 
    } 

    ... etc  
} 

通知討厭的try/finally結構,這是必要的,因爲關閉可能會拋出。閱讀更多關於here

+0

馬克 - 你能推薦關於這個主題的任何好的閱讀材料嗎?另外,在包裝這種嘗試/最後/嘗試以某種通用的方式時,是否有任何最佳做法?看起來像很多可能簡化的樣板代碼。 – Jedidja

+0

此鏈接可以得心應手:http://www.slideshare.net/blowdart/10-tricks-and-tips-for-wcf。幻燈片15顯示了一種類似的處理方法。 – Jedidja

+0

上次我不得不處理這個問題,我寫了一個可重用的方法來完成所有這些樣板代碼,並將Func作爲輸入參數,以便我可以將Func傳遞給該方法並對客戶端進行安全處理。 –