Правила безопасности наследования были нарушены при переопределении члена - SecurityRuleSet.Level2

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

Нарушение правил безопасности наследования а переопределяющий член: MyBusinessException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext). Безопасность доступность метода переопределения должен соответствовать безопасности от способа переопределения.

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

Я знаю, что один ответ для решения проблемы - установить SecurityRuleSet:

[assembly: SecurityRules(SecurityRuleSet.Level1)]

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

Ответ 1

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

Прочитайте Изменения безопасности в .NET Framework 4 и Защищенный прозрачный код, Уровень 2 из MSDN для получения дополнительной информации.

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

Ответ 2

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

[assembly: System.Security.AllowPartiallyTrustedCallers]

Удаление этого решения решило мою проблему, не переключаясь на SecurityRuleSet.Level1.

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

Я получил эту ошибку, которая не имела смысла для моего случая! Я использовал этот простой пример https://www.c-sharpcorner.com/article/using-autofac-with-web-api

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

Может быть, это сэкономит кому-то несколько часов бесполезного расследования.