2013-02-19 71 views
0

有時,在我的xp機器上,在我自動生成的客戶端代理中調用方法時會出現異常。我告訴調試器停止所有clr異常。 現在有時當我打電話以下幾點:在wcf客戶端代理中調用方法時的偶然異常

public MyStuff.Entities.Package GetPackageById(System.Guid sessionId, int packageId) 
    { 
     return base.Channel.GetPackageById(sessionId, packageId); 
    } 

我第一次得到一個InvalidOperationException:集合已修改...... 按F10導致FileLoadException用下面的messge:

無法加載文件或組件'System.Runtime.Serialization.resources,Version = 4.0.0.0,Culture = de-DE,PublicKeyToken = b77a5c561934e089'或它的一個依賴關係。 在當前狀態下操作不合法。(來自HRESULT的例外:0x80131509)

我確定該服務沒有拋出異常,因爲它會顯示爲FaultException。因爲它是InvalidOperationException當調用時引發base.Channel.GetPackageById(sessionId,packageId)我認爲這不是直接的問題嗎?

我慢慢地想出了什麼,我可以嘗試消除或解決此異常。

使用安裝了Windows 7和.NET 4.5的開發人員機器時,它從未發生過。在XP上,這大約會發生四次中的一次。在服務端

GetPackageById看起來是這樣的:

public Package GetPackageById(Guid sessionId, int packageId) 
     { 
      try 
      { 
       return DataProvider.Provider.GetPackagesByKey(packageId,null); 
      } 
      catch (Exception ex) 
      { 
       throw new FaultException<MySericeFault>(new MySericeFault(ex)); 
      }       
     } 

Package類看起來是這樣的:

[DataContract(IsReference = true)] 
    [KnownType(typeof(MyApp.Entities.MachinePackage))] 
    public partial class Package: INotifyPropertyChanged 
    { 
    private DateTime? _outDate; 
    [DataMember] 
    public DateTime? OutDate 
    { 
     get { return _outDate; } 
     set 
     { 
      if (_outDate != value) 
      { 
       _outDate = value; 
       OnPropertyChanged("OutDate"); 
      } 
     } 
    } 

    private int _productId; 
    [DataMember] 
    public int ProductId 
    { 
     get { return _productId; } 
     set 
     { 
      if (_productId != value) 
      { 
       _productId = value; 
       OnPropertyChanged("ProductId"); 
      } 
     } 
    } 
    protected virtual void OnPropertyChanged(String propertyName) 
    { 
     if (_propertyChanged != null) 
     { 
      _propertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged 
    { 
     add { _propertyChanged += value; } 
     remove { _propertyChanged -= value; } 
    } 
    private event PropertyChangedEventHandler _propertyChanged; 
    } 
+0

聽起來好像WCF連接異常終止,可能是被序列化的對象失敗。你有代碼顯示對象被序列化,所以我們可以檢查屬性等。通常循環引用可能會導致這種類型的問題。 – Belogix 2013-02-19 14:47:50

+0

如何關閉與服務的連接?當你得到第一個異常時,這是如何處理的?我認爲你需要發佈模式代碼得到答案死! – Jocke 2013-02-19 14:48:16

+0

正如第一句中所寫,它是用svcutil()自動生成的。NET 4) – 2013-02-19 14:48:48

回答

2

這更多的是一個實驗的,但是太大了,把作爲評論!

嘗試創建一個執行此代碼的新經營合同:

服務:

public Package GetPackageByIdTest(Guid sessionId, int packageId) 
{ 
    return new Package { ProductId = packageId, OutDate = DateTime.Now }; 
} 

然後創建引用您的服務控制檯應用程序,寫這樣的事:

客戶:

static void Main(string[] args) 
{ 
    for (int tester = 0; tester < 2000; tester++) 
    { 
     using (var service = new ConsoleApplication1.ServiceReference1.Service1Client()) 
     { 
      Package result = service.GetPackageByIdTest(Guid.NewGuid(), tester); 
      Console.WriteLine(result.ProductId); 
     } 
    } 

    Console.ReadKey(); 
    return; 
} 

然後,嘗試在其中一臺已知的XP機器上運行失敗,並查看是否遇到同樣的問題。如果沒有,則表示您的DataProvider.Provider.GetPackagesByKey(...)方法中會出現一些錯誤。

+0

我故意關閉並重新打開該服務,嘗試將其啓動,但我認爲它會正常工作,因爲我懷疑真正的問題在提供程序中。 – Belogix 2013-02-19 16:19:19

+0

今天我會嘗試一下。謝謝。 – 2013-02-20 06:51:48

+0

我用它來測試我的服務調用,結果證明我的服務非常強大。我一開始就拖延了客戶的一些電話,現在它像一個魅力。我想我必須像這樣離開它,直到Windows XP真的離開了!即使它沒有真正回答我最初提出的問題,接受這個答案是否合法? – 2013-03-01 12:53:20