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