Пустая ссылка исключение для MethodExecutionEventArgs.Method, использующего PostSharp с несколькими проектами веб-сервисов - PullRequest
0 голосов
/ 11 ноября 2009

HI

Я использую PostSharp для входа в систему и выхода для каждого метода в моей сборке приложения. Эта сборка строго названа, версионирована и зарегистрирована в GAC.

Затем он используется двумя проектами веб-служб, размещенными в отдельных виртуальных каталогах внутри IIS. Когда метод OnEntry / OnExit перехватчика вызывается WebServiceProject1, он работает нормально, однако, когда они затем вызываются WebServiceProject2, значение MethodExecutionEventArgs.Method, передаваемое в перехватчик, кажется нулевым, и я получаю исключение NullReferenceException.

Если вы перезапустите IIS и вызовете проекты веб-службы в порядке WebServiceProject2, WebServiceProject1 снова сработает первый вызывающий объект, а другой вызовет исключение NullReferenceException таким же образом. Код показан ниже:

[Serializable]
[Log(AttributeExclude = true)]
[AttributeUsage(AttributeTargets.All)]
public sealed class LogAttribute : OnMethodBoundaryAspect
{
  public override void OnEntry(MethodExecutionEventArgs eventArgs)
  {
    IoC.Resolve<ILogger>().WriteMethodEntry(eventArgs.Method, eventArgs.GetReadOnlyArgumentArray());
  }

  public override void OnExit(MethodExecutionEventArgs eventArgs)
  {
    IoC.Resolve<ILogger>().WriteMethodExit(eventArgs.Method, eventArgs.ReturnValue);
  }
}

Интересно, что если я удаляю сборку из GAC и запускаю проекты веб-сервисов из копии подкаталога \ bin, она работает нормально. Однако я не хочу этого делать, поскольку другая часть приложения полагается на сборки, находящиеся в GAC, и я не хочу, чтобы в разных местах было много разных версий одной и той же DLL.

Это похоже на проблему, описанную здесь: http://generatedbyatool.net/content/post/2009/07/27/PostSharp-Bug-or-How-To-Recycle-Your-Own-App-Pool.aspx, но есть очевидные различия.

У кого-нибудь есть идеи или советы? Я собираюсь попытаться создать отдельное приложение, чтобы доказать это сегодня.

Stoo

1 Ответ

0 голосов
/ 11 ноября 2009

Не могли бы вы сообщить об этой проблеме http://www.postsharp.org/tracker?

Обратите внимание, что существует известная проблема, когда обрабатываемая сборка находится в GAC. Сборка НЕ ​​должна быть в GAC (даже старой версии, если она имеет тот же номер версии), когда PostSharp обрабатывает ее. Вы должны удалить его на этапе перед сборкой.

Однако, если PostSharp работал правильно, я не вижу причин, по которым метод не прошел. Вы пытались увидеть в Reflector, что происходит?

-gael

...