突然、私が開発した 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 が渡されるため、型チェックが失敗する場所だと思います。そして、私はアセンブリのバージョンを疑うでしょうが、私が言ったように、それは常に私にとっては機能し、時にはユーザーのためにも機能します.