我正在尝试在我的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中。
答案 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()覆盖,它开始工作!