Является ли попытка разработать для Среднего доверия потерянное дело?
Я начал разрабатывать новое приложение MVC с первым кодом Entity Framework и Unity для инъекции зависимостей. Я использовал EF5 и Unity, потому что думал, что они должны работать в Medium Trust. Однако, когда я выбрал тег <trust level="Medium" />
в моем web.config
, я начал получать исключения разрешений на отражение.
Кажется, что всякий раз, когда я выхожу за рамки встроенных функций, таких как System.Data.SqlClient
ADO.net, я всегда сталкиваюсь с проблемами в средстве доверия. Auto-Mapper: сбой. NHibernate: сбой. MySQL: сбой. EF5 Code-first: fail. IOC: сбой.
Я просто преследую трубную мечту? Возможно ли достичь хорошо продуманного и проверяемого веб-приложения с использованием современной технологии, которая будет работать в среде Trust Trust?
В эпоху виртуальных машин/виртуальных серверов/облачных вычислений (и даже несколько общих хостов, которые будут устанавливать пулы приложений в Full Trust), кто-нибудь нашел, что разработка для среднего уровня доверия стоит усилий?
Ответы
Ответ 1
Официальная позиция команды ASP.NET заключается в том, что средний траст устарел. Это означает несколько вещей:
- Мы автоматически разрешаем все связанные с Интернетом ошибки, о которых сообщают нам, как "не исправить".
- Мы предоставили руководство для хостеров, чтобы они должны были перейти от среднего доверия и вместо этого использовать изолированную изолированность на уровне ОС (http://support.microsoft.com/kb/2698981).
- Мы удаляем поддержку среднего доверия из разрабатываемых нами фреймворков (MVC, WebAPI, SignalR и т.д.). В будущем приложения, созданные на основе этих фреймворков, потребуют полного доверия.
Здесь термин "Средний траст" выше относится ко всем конфигурациям не полностью полного доверия в ASP.NET, включая использование встроенных уровней доверия (минимальный, низкий, средний, высокий) или любых настраиваемых уровней доверия.
Редактировать 26 мая 2015 г.:.NET Framework в целом отвергла частичное доверие, и клиентам рекомендуется не полагаться на нее как на границу безопасности. Из MSDN:
Безопасность доступа к коду в .NET Framework не должна использоваться как граница безопасности с частично доверенным кодом, особенно код неизвестно изначальный. Мы не рекомендуем загружать и выполнять код неизвестного происхождения без применения альтернативных мер безопасности в место.
Ответ 2
В общем, все, что нуждается в Reflection в глубоком смысле, не может работать на Medium Trust
В вашем случае:
Automapper: используйте отражение, чтобы обнаружить соответствующие свойства и поток памяти, чтобы клонировать их (существует версия, которая фактически работает в среде с определенным ограничением)
NHIbernate: используйте отражение, чтобы позволить Lazy Loading, потому что ленивая загрузка в NH реализована прокси-серверами (чтобы избежать этого, вы можете отключить Lazy Loading или использовать NHibernate ProxyGenerator, которая является утилитой, которая помогает предварительно создать Proxies)
Nhibernate ProxyGenerator
EF: На самом деле я не нашел больших проблем с EF и Medium Trust.... не сериализует объект с ассоциациями или коллекциями
IoC: IoC - это приложение Killer для отражения:) вы можете попробовать AutoFac, который работает на Medium Trust
AutoFac
В целом Medium Trust является большим ограничением... но все зависит от того, на каком проекте вы работаете.
Подумайте также о том, чтобы использовать несколько хостов Full Trust, таких как Arvixe
Надеюсь, что это поможет