0

最近、Web サイトを Web アプリケーションに変換しました。展開すると、すべてが完全に機能します。アプリケーションのシャットダウンを許可した場合 (つまり、誰もアプリケーションを 1 時間使用しない場合)、アプリケーションに戻ると、ログイン ページは正常にロードされますが、Web サービス (古い SOAP サービス) への呼び出しは失敗します。これは、開発環境では再現されず、サーバー上でのみ再現されます。

いくつかの問題を突き止めたところ、1 つまたは複数の文字列が使用前に初期化されていなかったため、空または null 文字列が発生して事態が悪化したようです。

私たちを本当に悩ませていることの 1 つは、Log4Net のログ記録が完全に停止することです。そのため、問題を追跡するには、かなりのクラッジコードが必要です。

根本的な原因 (そしてできれば修正) のアイデア

========更新=========

問題の 1 つが興味深い状況に突き止められました…</p>

失敗したサービス呼び出しは、「少なくともクライアント プロパティを指定する必要があります」を生成しました。これはこれで設定されます

profile.Client = ApplicationName;

public static string ApplicationName
{ 
  get 
  {
     return string.Format(CLIENTNAME, Resources.AppVersion.Version);
  }
}

どの呼び出し:

internal static string Version 
{
    get 
    {
        return ResourceManager.GetString("Version", resourceCulture);
    }
}

概念的には、一度機能したら失敗することはありません。

もう 1 つの問題は、Web アプリケーションのリロード時に Log4net が機能しないことでした。ここでも静的が発生しました。

    private static readonly ILog ExceptionLog = LogManager.GetLogger("ExceptionLogger");
    private static readonly ILog SoaLog = LogManager.GetLogger("soaPerfLogger");
    private static readonly ILog InfoLog = LogManager.GetLogger("InfoLogger");
    private static readonly ILog DebugLog = LogManager.GetLogger("DebugLogger");

明らかな原因は、Web アプリケーションの再起動時に null になる静的変数のようです。それらは再初期化されていません。

ステキな提案お待ちしております!それ以外の場合は、コード内の 852 の静的使用法をすべて調べて、この異常な動作に対処するコードを追加することになります。

4

2 に答える 2

1

特定の順序で初期化されることを期待するなど、静的フィールド間に依存関係はありますか? クラスに静的コンストラクターがない場合、それらが初期化される順序は保証されません。静的フィールドを使用するときは常に静的コンストラクターを含めるようにし、通常はフィールド初期化子を使用する代わりにそこで初期化を行います。静的フィールドの初期化に関する C# 言語仕様を参照してください。

また、granadaCoder の提案を見て、それがあまり苦痛でなければ、シングルトンのインスタンス フィールドにすることもできます。

このアプリケーションが実行されている IIS のバージョンは?

于 2013-09-25T17:37:04.650 に答える
0

ケン、

複数のasp.netスレッドで共有されているため、asp.netの静的メンバーにひどく噛まれました。(静的メソッドは問題ありません。)それがあなたの問題に関連している可能性があるかどうかはわかりませんが、それらをインスタンスベースにすることはできますか? それらの初期化にコストがかかる場合は、それらをApplication変数として App Start またはおそらく に保存することを検討してくださいCache

起動時にアプリケーションに複数のリクエストがヒットする可能性はありますか? 初期化が長時間実行されている場合、スレッド/リクエスト番号1が値の入力を開始し、スレッド/リクエスト#2が来て値をnullに再初期化しますか?

とは言っても、私はスレッドの専門家ではありませんが、何年も前に参加したコード レビュー/トラブルシューティングの演習で、まさにこの問題であることが判明した素晴らしい話をお伝えできます。クライアントには数千のリクエストが短期間で発生し、一部はstatic他のリクエストによって入力されたデータを上書きしていました (そして学生は間違ったクラスに登録されていました)。 Web アプリケーションの静的メンバー。

于 2013-09-25T16:32:43.910 に答える