2013-02-19 75 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