2010-02-02 82 views
4

使用VS2008,vb.net,C#,FW 3.5WCF,通道工廠和異常

我在我的客戶端消耗我的服務

服務在IIS

客戶託管(的WinForms MDI )用SvcUtil工具使用/升生成的,/ R,/ CT,&/n個開關

服務和客戶端都使用MyEntities.dll

我使用nettcp與TransportWithMessageCredential 我緩存代理的主要形式

if Membership.ValidateUser(UsernameTextBox.Text, PasswordTextBox.Text) 
    _proxy = new MyServiceClient 
    _proxy.ClientCredentials.UserName.UserName = "username" 
    _proxy.ClientCredentials.UserName.Password = "password" 

我再繞通過_proxy任何子窗體/需要使用它 前

List(of Orders) = _proxy.ChannelFactory.CreateChannel.GetOrders(customer) 

一切是偉大的工作插件,但我問題是這樣的:

通話後的通道會發生什麼?他們神奇地處置?

我怎樣才能用探查器來監控這個?

有沒有方法可以讓我有錯誤處理在一個地方,或者我需要放置的try/catch在每次調用像What is the best workaround for the WCF client `using` block issue?

我可以訂閱_proxy.InnerChannel.Faulted做那裏清理?

問候

_Eric

+0

對於處置問題,代理未配置神奇除非你叫處置上的代理。 – pdiddy 2010-02-02 19:09:18

+0

頻道怎麼樣?我不想在客戶退出之前處理代理。它會返回到游泳池嗎? – Eric 2010-02-02 19:15:59

回答

2

我用做兩個不同的東西,這取決於使用情況:

  • 在客戶端的情況,我知道信道只有一個實例,在使用一段時間,我懶惰地創建一個頻道,並重新使用創建的實例。如果發生故障,關閉或丟棄,則重新創建頻道。
  • 在場景中多個通道可以同時請求,我認爲這是最好做的異常處理的舞蹈。爲了避免代碼膨脹,您可以集中它變成接受,它完成的,所以它形成圍繞你的有效載荷代碼追記型外骨骼實際工作委託的方法。
+0

我同意「異常處理舞蹈」。我最終使用了codeplex的異常處理WCF代理生成器。 – Eric 2010-02-05 21:41:17

1

附加測試結果/注意到

看來我已經部分回答了我的問題,我這個跑環500 X

List(of Orders) = _proxy.ChannelFactory.CreateChannel.GetOrders(customer) 

這是非常邪惡,並且在第11次迭代開始時出現超時錯誤,這是我服務的最大用戶數(10)。這是否意味着某人可以實現任何wcf客戶端並打開wcf服務器允許的多個通道?

我也覺得這給了我預期的結果,並完成了所有500次迭代

Dim channel = _proxy.ChannelFactory.CreateChannel 
    e.result = Channel.GetOrders(customer) 
    Dim Ich = DirectCast(channel, ServiceModel.IClientChannel) 
    Ich.Close() 
    Ich.Dispose() 

我現在的問題是 我可以casttochannel,關閉和處置_proxy.InnerChannel.Faulted事件中或在每次調用我只是試圖包裝它,然後捕獲超時/通信/故障例外,離開代理是,但處置通道?如果後者是這種情況,有沒有辦法來封裝這個?

問候

_Eric