Случайный метод get_Session типа из сборки не имеет реализации

Внезапно веб-приложение, которое я разрабатываю, начало выдавать это сообщение об ошибке — пользователю, но не мне, и только иногда.

Я знаю, что эта ошибка может быть вызвана несоответствием эталонных версий сборки интерфейса и сборки реализации. Но я давно не обновлял версию Sharp (до сих пор использую очень старую версию для этого проекта). Кроме того, ошибка возникает не всегда, если бы это была неправильная сборка, я полагаю, она всегда будет терпеть неудачу.

Что может быть причиной? Есть ли какие-либо инструменты отслеживания/входа в систему, чтобы узнать?

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, поэтому я полагаю, что здесь проверка типов не удалась. И я бы подозревал версии сборки, но, как я уже сказал, это всегда работает для меня и иногда работает для пользователя.


person queen3    schedule 13.05.2011    source источник
comment
Файл DLL иногда недоступен? Я могу себе представить, что такого рода 'катастрофический сбой (OT )' приводит к перезагрузке веб-приложения. Если в это время файл DLL перезаписывается/разблокируется, это объясняет, что ошибка появляется только один раз.   -  person sehe    schedule 13.05.2011
comment
Хм, верно, я вижу в Event Viewer ошибки в w3wp, в kernel32.dll, адрес 0x0000bee7.   -  person queen3    schedule 13.05.2011
comment
Я предполагаю, что необработанное исключение выгружает ваш домен приложения. Погуглите для этого (например, здесь или проверить утечки ресурсов   -  person sehe    schedule 13.05.2011
comment
На самом деле на сервере было 1 МБ свободного места.   -  person queen3    schedule 17.05.2011
comment
@Queen: спасибо за отзыв. Вы можете сделать это ответом, чтобы люди могли видеть, что проблема решена. По теме: Я предполагаю, что тогда JIT не смог выделить место для скомпилированного образа   -  person sehe    schedule 17.05.2011
comment
Да, спасибо за помощь. Недостаток места на диске был побочным эффектом, вы были правы насчет катастрофического сбоя. Если вы сделаете это ответом, я приму его - если вы заботитесь о баллах ;-)   -  person queen3    schedule 25.05.2011


Ответы (1)


Я бы лучше принял комментарий sehe в качестве ответа, но в любом случае. Проблема заключалась в исключении StackOverflowException из-за рекурсивных данных БД. Чтобы отладить это, мне пришлось добавить журналирование ко многим строкам внутри подозрительного кода (ошибка произошла при доступе к службе SOAP и сопоставлении данных с использованием БД), а затем проанализировать. Другой подход заключался в развертывании отладочной сборки (это сервер разработки) и использовании WinDbg, который дал правильный код исключения 0xe053534f, чтобы я мог сосредоточиться на коде, который может вызвать это (рекурсивный метод LINQ для сбора связанных продуктов).

Недостаток места на диске был побочным эффектом DW20.exe (dr. watson), потребляющего 1,5 ГБ места (и ЦП).

Средство просмотра событий немного помогло, потому что оно показывало слишком общую ошибку «kernel32.dll, адрес 0x0000bee7», которая может быть переполнением стека, а может быть чем угодно.

Получение «метод не имеет реализации» - это последняя информация, которую я ожидаю от таких условий.

person queen3    schedule 25.05.2011