webpart中的自定义TraceProvider实现会引发安全性异常

时间:2009-07-02 18:46:48

标签: sharepoint logging moss web-parts

我正在尝试在我的webpart中实现一些日志记录。我实现了一个自定义跟踪提供程序实现,它将日志消息写入12个配置单元日志,如下所述:

http://msdn.microsoft.com/en-us/library/aa979522.aspx

我已将上述代码包装到名为logging.DLL的dll中。

我在我的webpart中引用了这个DLL。

我使用提升的权限在构造函数中调用RegisterTraceProvider。

我已在manifest.xml中将Logging DLL声明为安全控件。

但是当我尝试将webpart添加到页面时,我收到一条安全异常,其中包含“请求失败”消息。在尝试调用RegisterTraceProvider方法时,构造函数中会抛出此错误。

我在这里遗漏了什么吗?如何才能使此日志记录生效?

编辑:我的日志记录DLL和我的webpart DLL都在GAC中。

3 个答案:

答案 0 :(得分:3)

由于跟踪提供程序使用非托管代码,因此应使用以下方法标记方法:

[SecurityPermission(SecurityAction.Assert, SecurityPermissionFlag.UnmanagedCode)]

这将确保.NET的安全性在达到此属性时停止在调用堆栈中进一步检查,从而允许较少受信任的代码执行非托管调用。请记住,日志记录dll仍然需要运行权限,因此要么在manifest.xml中提供CAS策略,要么将其放在GAC中。如果您将它放在GAC中,请使用以下属性对其进行标记,使其可以从非完全受信任的dll调用:

[assembly: AllowPartiallyTrustedCallers]

然后您应该能够从部署到bin目录的WebPart中调用它。

答案 1 :(得分:1)

您的webpart是否部署在GAC或Bin文件夹中? 如果它位于Bin文件夹中,则webpart不会在完全信任下运行,因此您需要为您的webpart编写代码访问安全策略,允许它在完全信任下运行对API的调用。

示例检查this或仅Google支持Sharepoint +代码访问安全策略。

答案 2 :(得分:0)

我在构造函数中做了一个RegisterTraceprovider()调用。看起来这就是失败的原因。我将RegisterTraceProvider()调用移动到OnInit()覆盖,它开始工作!