2010-06-16 2 views
42

У меня есть класс, который наследуется от Exception. В .NET 4, я начал получать ошибку во время выполнения:Нарушение правил безопасности при переопределении элемента - SecurityRuleSet.Level2

Inheritance security rules violated while overriding member: MyBusinessException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'. Security accessibility of the overriding method must match the security accessibility of the method being overriden.

Я думаю, что проблема вызвана тем, что я переопределяя GetObjectData.

Я знаю один ответ для решения вопроса является установка SecurityRuleSet:

[assembly: SecurityRules(SecurityRuleSet.Level1)] 

Это не является приемлемым ответом, я хотел бы знать, как решить эту проблему без необходимости расслабить безопасности по умолчанию правила в .NET 4.

ответ

32

Mark GetObjectData с SecurityCriticalAttribute, так как он применяется к Exception.GetObjectData. Переопределенный элемент должен иметь такую ​​же доступность безопасности (критический, безопасный или прозрачный).

Прочтите Security Changes in the .NET Framework 4 и Security Transparent Code, Level 2 от MSDN для получения дополнительной информации.

Чтобы избежать всех возможных исключений для обеспечения безопасности, включите анализ кода с помощью набора правил безопасности. Вы получите предупреждения статического анализа, которые могут соответствовать ошибкам времени выполнения.

+3

Прохладный, это сработало! Я действительно пробовал это, но я применил атрибут на уровне класса, а не на уровне участника. –

+1

Я пытаюсь сделать это на InitializeLifeTimeService, и он не хочет работать, получает ту же ошибку. – adriaanp

+0

Как это сделать? можете ли вы показать какой-то код? – brainmurphy1

11

Об этой ошибке в средах совместного размещения, которые позволяют использовать приложения с полным доверием. Когда вы разворачиваете приложение, вы часто перезаписываете web.config. Под IIS, при изменении параметров доверия на что-то другое, чем по умолчанию, ваш раздел веб-конфигурации модифицирована:

<system.web> 
    <trust level="Full" /> 
<system.web> 

Копирование нового web.config во время развертывания часто переписывает эту установку, однако IIS Admin еще покажет сайт как «Полное доверие», когда на самом деле сайт работает на любом уровне доверия по умолчанию для вашего общего хост-провайдера (обычно среднего).

Вы увидите эту ошибку и сделаете то, что я сделал - попытайтесь понять, почему вы ее увидите, даже если знаете, что сайт работает под полным доверием, когда на самом деле это не так. Решение состоит в том, чтобы изменить вашу веб-конфигурацию, как указано выше, перед развертыванием, или использовать IIS Admin, чтобы установить сайт на другой уровень доверия (например, высокий), применить его, а затем установить его полностью. Это позволяет повторно вставить необходимую информацию о файле конфигурации и полностью перезапустить пул приложений.

17

Если бы эта проблема, когда я звоню сборку, которая имела атрибут AllowPartiallyTrustedCallers:

[assembly: System.Security.AllowPartiallyTrustedCallers] 

Удаление это решить мою проблему без перехода на SecurityRuleSet.Level1.

+0

Это было быстрое и грязное исправление, чтобы скомпилировать источник DevExpress. –

+4

Это будет содержаться в AssemblyInfo.cs, по крайней мере, для меня. Избавиться от него он решил и для меня. –

1

Для меня проблема была связана с библиотекой log4net. Я загрузил источник и добавил файл проекта в свое решение, чтобы я мог войти во внешние библиотеки. Однако для log4net необходим символ NET_4_0, определенный для условной компиляции. По умолчанию оно было определено как NET_1_0. Я вошел в свойства проекта log4net и изменил NET_1_0 на NET_4_0, и это устранило проблему.

Помимо: Возможно, я не следую лучшим методам, включив библиотеки в свой проект. Если это так, я бы приветствовал обратную связь по различным способам ее решения, а также за и против каждого выбора.Мое настоящее мышление заключается в том, что если есть ошибка, возможность увидеть источник библиотеки поможет мне понять, что ожидает библиотека, что поможет мне устранить эту ошибку. Кроме того, видя, как другие люди пишут исходный код, ничего, если не ценный опыт обучения. В основном, я пытаюсь следовать совету Джеффа Этвуда, найденного here. Но если есть лучший способ сделать это, я все уши.

Смежные вопросы