零星的“程序集类型中的方法'get_Session'没有实现”

本文关键字:Session 实现 get 类型 程序集 方法 | 更新日期: 2023-09-27 17:56:24

突然间,我开发的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,所以我想这就是类型检查失败的地方。我会怀疑程序集版本,但正如我所说,它总是对我有用,有时对用户有用。

零星的“程序集类型中的方法'get_Session'没有实现”

我最好接受 sehe 的评论作为答案,但无论如何。问题是由于递归数据库数据而导致的StackOverflowException。为了调试它,我必须将日志记录添加到可疑代码中的许多行中(错误发生在 SOAP 服务访问和使用 DB 映射数据上),然后进行分析。另一种方法是部署调试版本(这是开发服务器)并使用 WinDbg,它提供了正确的异常代码0xe053534f以便我可以专注于可能导致此问题的代码(递归 LINQ 方法收集相关产品)。

低驱动器空间是DW20.exe(沃森博士)占用1.5 GB空间(和CPU)的副作用。

事件查看器有点帮助,因为它显示了过于通用的"kernel32.dll,地址0x0000bee7"错误,可能是堆栈溢出,也可能是其他任何错误。

获得"方法没有实现"是我期望从此类条件中获得的最后信息。