我正在使用 PostSharp 记录应用程序程序集中每个方法的进入和退出。此程序集在 GAC 中进行了严格命名、版本控制和注册。
然后由 IIS 内不同虚拟目录中托管的 2 个 Web 服务项目共享。当 WebServiceProject1 调用拦截器的 OnEntry/OnExit 方法时,它工作正常,但是当它们被 WebServiceProject2 调用时,传递给拦截器的 MethodExecutionEventArgs.Method 值似乎为空,我得到一个 NullReferenceException。
如果重新启动 IIS 并按 WebServiceProject2、WebServiceProject1 的顺序调用 Web 服务项目,那么第一个调用的项目再次起作用,另一个以相同的方式抛出 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 中删除程序集并使 web 服务项目从 \bin 子目录副本中运行,它可以正常工作。但是我不想这样做,因为应用程序的另一部分依赖于 GAC 中的程序集,而且我不希望在不同的地方有很多不同版本的同一个 DLL。
它类似于此处描述的问题:http: //generatedbyatool.net/content/post/2009/07/27/PostSharp-Bug-or-How-To-Recycle-Your-Own-App-Pool.aspx但那里是明显的区别。
今天我将尝试构建一个独立的应用程序来证明这一点。