Пользовательская реализация TraceProvider в веб-части вызывает исключение безопасности
Я пытаюсь выполнить регистрацию в моей веб-части. Я реализовал реализацию пользовательского поставщика трассировки, которая записывает сообщения журнала в 12 журналов улья, как описано здесь:
http://msdn.microsoft.com/en-us/library/aa979522.aspx
Я обернул вышеупомянутый код в dll с именем logging.DLL.
Я ссылаюсь на эту DLL в моей веб-части.
Я вызываю RegisterTraceProvider в конструкторе, используя повышенные привилегии.
Я объявил Logging DLL как безопасный элемент управления в manifest.xml.
Но когда я пытаюсь добавить веб-часть на страницу, я получаю исключение безопасности с сообщением "Запрос не выполнен". Эта ошибка генерируется в конструкторе, когда он пытается вызвать метод RegisterTraceProvider.
Я что-то здесь упускаю? Как я могу заставить эту регистрацию работать?
Изменить: и моя DLL регистрации и моя веб-часть DLL находятся в GAC.
3 ответа
Я делал m RegisterTraceprovider() вызов внутри конструктора. Похоже, это была причина, по которой это не удалось. Я переместил свой вызов RegisterTraceProvider() в переопределение OnInit(), и он начал работать!!
Поскольку поставщик трассировки использует неуправляемый код, вы должны пометить метод следующим образом:
[SecurityPermission(SecurityAction.Assert, SecurityPermissionFlag.UnmanagedCode)]
Это обеспечит прекращение проверки безопасности.NET в стеке вызовов при достижении этого атрибута, что позволит менее надежному коду выполнять неуправляемые вызовы через него. Помните, что для ведения журнала dll по-прежнему нужны разрешения для запуска, поэтому либо предоставьте ему CAS-policy в manifest.xml, либо поместите его в GAC. Если вы поместите его в GAC, пометьте его следующим атрибутом, который делает его доступным из не полностью доверенной dll:
[assembly: AllowPartiallyTrustedCallers]
Тогда вы сможете вызвать его из WebPart, развернутого в каталог bin.
Размещена ли ваша веб-часть в папке GAC или Bin? Если он находится в папке Bin, веб-часть не работает в режиме полного доверия, поэтому вам необходимо написать Политику безопасности доступа к коду для веб-части, позволяющую ей выполнять вызов API в режиме полного доверия.
например, проверьте это или просто Google для политики безопасности Sharepoint + Code Access.