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

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

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

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

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

[assembly: SecurityRules(SecurityRuleSet.Level1)]

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

5 ответов

Решение

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

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

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

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

[assembly: System.Security.AllowPartiallyTrustedCallers]

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам