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

时间:2011-05-13 08:11:12

标签: c# .net asp.net-mvc sharp-architecture 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." 

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,所以我想这是类型检查失败的地方。我会怀疑组装版本,但正如我所说,它总是适用于我,有时适合用户。

1 个答案:

答案 0 :(得分:1)

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

低驱动器空间是DW20.exe(dr.watson)占用1.5 GB空间(和CPU)的副作用。

事件查看器有点帮助,因为它显示了太一般的“kernel32.dll,地址0x0000bee7”错误,可能堆栈溢出,可能是其他任何东西。

获取“方法没有实现”是我从这些条件中得到的最后信息。