0

xpマシンで、自動生成されたクライアントプロキシのメソッドを呼び出すときに例外が発生することがあります。すべてのclr例外で停止するようにデバッガーに指示しました。今時々私が次のように呼ぶとき:

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

最初にInvalidOperationExceptionが発生します:コレクションが変更されました... F10を押すと、次のメッセージを含むFileLoadExceptionが発生します。

ファイルまたはアセンブリ'System.Runtime.Serialization.resources、Version = 4.0.0.0、Culture = de-DE、PublicKeyToken=b77a5c561934e089'またはその依存関係の1つを読み込めませんでした。現在の状態では、操作は合法ではありません。(HRESULTからの例外:0x80131509)

FaultExceptionとして表示されるため、サービスが例外をスローしなかったと確信しています。base.Channel.GetPackageById(sessionId、packageId)を呼び出すときにスローされるのはInvalidOperationExceptionなので、直接私のせいではないと思いますか?

この例外を排除または回避するために何を試みることができるかについて、私はゆっくりとアイデアを使い果たしています。

Windows7と.NET4.5がインストールされている開発者のマシンを使用している場合は発生しませんでした。XPでは、これは約4回に1回発生します。

サービス側の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));
            }                        
        }

パッケージクラスは次のようになります。

    [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;
    }
4

1 に答える 1

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 マシンの 1 つでそれを実行してみて、同じ問題が発生するかどうかを確認します。そうでない場合は、メソッドに何か問題があることを示唆していますDataProvider.Provider.GetPackagesByKey(...)

于 2013-02-19T16:17:59.793 に答える