0

WCFサービスからメソッドを呼び出そうとすると、型の初期化エラーが発生します。

'XYZAuditService'の型初期化子が例外をスローしました。

ただし、例外の原因となるコードには何も表示されません。

public enum AuditProcessType
{
    Facility,
    Patient,
    Report,
}


[ServiceBehavior(Name = "AuditService",
    Namespace = "http://xyz/services/2008/08",
    InstanceContextMode = InstanceContextMode.PerSession,
    ConcurrencyMode = ConcurrencyMode.Single)]
public class AuditService : IAuditServiceContract
{
    private static Dictionary<AuditProcessType, Func<IAuditor>> auditServiceFactories;

    static AuditService()
    {
        auditServiceFactories = new Dictionary<AuditProcessType, Func<IAuditor>>()
        {
            { AuditProcessType.Facility, () => Auditor<Facility>.Instance },
            { AuditProcessType.Patient, () => Auditor<Patient>.Instance },
            { AuditProcessType.Report, () => Auditor<Report>.Instance },
        };
    }

    // ...

    private static IAuditor GetAuditor(AuditProcessType process)
    {
        Func<IAuditor> factory;
        if (!auditServiceFactories.TryGetValue(process, out factory) || factory == null)
        {
            throw new ArgumentException(..., "process");
        }

        IAuditor auditor = null;
        try
        {
            auditor = factory();
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException(..., ex);
        }

        if (auditor == null)
        {
            throw new InvalidOperationException(...);
        }

        return auditor;
    }
}

public class Auditor<T> : IAuditor
{
    private static Auditor<T> _instance = new Auditor<T>();

    public static Auditor<T> Instance
    {
        get
        {
            return _instance;
        }
    }

    private Auditor()
    {
    }

    // ...
}

私のロギングフレームワークは内部例外の詳細を表示しないため、これ以上の情報を取得することはできません。何を試しても、型初期化子内でVSデバッガーを停止させることができないようです。それでも、このコードがどのように例外を発生させているのかわかりません。私のコード自体は、ファクトリディクショナリを初期化するだけで、を呼び出すことさえしませんAuditService<T>.Instance。他に何がこれを引き起こしている可能性がありますか?

4

2 に答える 2

0

これをアセンブリの読み込みエラーまで追跡しました。IAuditorは とは別のアセンブリで定義されておりAuditService、展開中の問題により、IAuditorインターフェイスのアセンブリがアプリケーションの bin ディレクトリに正しく含まれていませんでした。型の初期化中にエラーが発生しました。これは、アセンブリの読み込みが発生した時点であったためです。

于 2013-02-26T22:25:20.347 に答える
0

型初期化子が失敗するためには、何らかのコードを実行する必要があり、そのコードは失敗する必要があります。あなたが投稿したものを見ると、実行可能なコードの唯一の部分はここにあります:

{ ... , () => Auditor<Facility>.Instance },
{ ... , () => Auditor<Patient>.Instance },
{ ... , () => Auditor<Report>.Instance },

ラムダを次のように変更します

() => { 
    try { return Auditor<Facility>.Instance;  } 
        catch (Exception ex) 
        { System.Diagnostics.WriteLine(ex.Message); } 
}

そして、それが何らかのエラーをキャッチしないかどうかを確認してください。

于 2013-02-26T17:48:52.177 に答える