2009-07-02 72 views
0

我想在web部件中實現一些日誌記錄。我實現了一個自定義跟蹤提供程序執行情況已經在這裏描述了寫日誌信息到12個蜂巢日誌:webpart中的自定義TraceProvider實現引發安全異常

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

我在做構造函數裏面的RegisterTraceprovider()調用。看起來這是它失敗的原因。我將RegisterTraceProvider()調用移入OnInit()覆蓋,並開始工作!

1

您的web部件是否部署在GAC或Bin文件夾中? 如果它位於Bin文件夾中,則Web部件未在完全信任下運行,因此您需要爲您的Web部件編寫代碼訪問安全策略,允許它在完全信任下運行API調用。

舉例來說,檢查this或Google for Sharepoint +代碼訪問安全策略。

3

由於跟蹤提供程序使用非託管代碼,你應該標記與方法:

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

這將確保.NET的安全停靠在達到此屬性時調用堆棧,這讓信任程度較低的代碼進一步檢查做非託管電話。請記住,日誌記錄dll仍然需要運行權限,因此無論是在manifest.xml中提供CAS策略還是將其放入GAC中。如果你把它在GAC,具有以下屬性,這使得它從一個非完全可信的DLL調用它標記:

[assembly: AllowPartiallyTrustedCallers] 

那麼你應該能夠從部署到bin目錄中的WebPart調用它。

+0

嘿..感謝您的文章,我從中學到了一些東西。但是我的日誌記錄DLL和我的webpart DLL都在GAC中。我仍然得到例外。 – ashwnacharya 2009-07-03 06:51:06