1

突然、私が開発した Web アプリがこのエラー メッセージを表示し始めました。ユーザーには表示されますが、私には表示されません。

このエラーは、インターフェイス アセンブリと実装アセンブリ参照のバージョンの不一致が原因で発生する可能性があることを知っています。しかし、私は長い間シャープのバージョンを更新していませんでした (このプロジェクトではまだ非常に古いバージョンを使用しています)。また、エラーが常に発生するとは限りません。アセンブリが間違っていた場合、常に失敗すると思います。

その理由は何ですか?フレームワークに調べるためのトレース/ログインツールはありますか?

Method 'get_Session' in type 'Orders.Data.SafeSessionStorage' 
from assembly 'Orders.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 
does not have an implementation." 

System.TypeLoadException: Method 'get_Session' in type 'Orders.Data.SafeSessionStorage' from assembly 'Orders.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.
   at Orders.Web.MvcApplication.InitializeNHibernateSession()
   at Orders.Web.MvcApplication.<Application_BeginRequest>b__1d()
   at SharpArch.Data.NHibernate.NHibernateInitializer.InitializeNHibernateOnce(Action initMethod)
   at Orders.Web.MvcApplication.Application_BeginRequest(Object sender, EventArgs e)
   at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

これが SafeSessionStorage です。これは、バックグラウンド スレッドでの実行をサポートするために、SharpArch のものをわずかに変更したバージョンです。

public class SafeSessionStorage : ISessionStorage
{
  [ThreadStatic]
  private static ISession _session;

  public ISession Session
  {
     get
     {
        HttpContext context = HttpContext.Current;
        if (context == null)
           return _session;
        else
        {
           ISession session = context.Items[factoryKey] as ISession;
           return session;
        }
     }
     set
     {
        HttpContext context = HttpContext.Current;
        if (context == null)
           _session = value;
        else
           context.Items[factoryKey] = value;
     }
  }

  public string FactoryKey
  {
     get { return factoryKey; }
  }

  public static void End()
  {
     if (_session != null)
        _session.Close();
     _session = null;
  }

  public void EndRequest()
  {
     ISession session = Session;

     if (session != null)
     {
        session.Close();
        HttpContext context = HttpContext.Current;
        if (context != null)
           context.Items.Remove(factoryKey);
        else
           _session = null;
     }
  }

  private string factoryKey = NHibernateSession.DefaultFactoryKey;
}

エラーが発生する場所は次のとおりです。

  private void InitializeNHibernateSession()
  {
     NHibernateInitHelper.InitSession(safeSessionStorage,
        Server.MapPath("~/NHibernate.config"),
        Server.MapPath("~/bin/Orders.Data.dll"));
  }

ここで、InitSession は ISessionStorage を想定し、SafeSessionStorage が渡されるため、型チェックが失敗する場所だと思います。そして、私はアセンブリのバージョンを疑うでしょうが、私が言ったように、それは常に私にとっては機能し、時にはユーザーのためにも機能します.

4

1 に答える 1

1

私はseheのコメントを答えとして受け入れるほうがよいですが、とにかく。問題は、再帰的なDBデータによるStackOverflowExceptionでした。これをデバッグするには、疑わしいコード内の多くの行にログを追加し(SOAPサービスアクセスとDBを使用したデータのマッピングでエラーが発生しました)、分析する必要がありました。別のアプローチは、デバッグビルド(これは開発サーバーです)をデプロイし、WinDbgを使用することでした。これにより、正しい例外コード0xe053534fが生成され、これを引き起こす可能性のあるコード(関連製品を収集する再帰的なLINQメソッド)に集中できます。

ドライブ容量が少ないのは、DW20.exe(ワトソン博士)が1.5 GBの容量(およびCPU)を消費したことによる副作用でした。

イベントビューアは、スタックオーバーフローなどの可能性があるあまりにも一般的な「kernel32.dll、アドレス0x0000bee7」エラーを示していたため、少し役に立ちました。

「メソッドには実装がありません」を取得することは、そのような条件から私が期待する最後の情報です。

于 2011-05-25T09:48:34.957 に答える