Каковы наиболее распространенные, типичные вещи, чтобы избежать кодирования в моем приложении ASP.NET, чтобы оно работало в среде Medium Trust на общем хосте?
Что мешает вам сделать Medium Trust? Например, я уже узнал, что Medium Trust мешает вам использовать System.IO.Path.GetTempPath(). Какие еще вещи, как это?
6 ответов
Вот как узнать о проблемах доверия и решить их.
1) Найдите в своих папках Windows\Microsoft.NET\Framework[ВАША ВЕРСИЯ]\CONFIG файлы:
- web.config (это корневой конфигурационный файл)
- web_mediumtrust.config
- web_hightrust.config
2) Измените web.config, чтобы сказать
<trust level="Medium" originUrl="" />
3) Попробуйте ваше приложение ASP.NET. Мой не удалось с ошибкой разрешения.
4) Различайте web_mediumtrust.config и web_hightrust.config в инструменте сравнения, таком как WinMerge.
5) Скопируйте настройки с высокой на среднюю по одной и посмотрите, как они влияют на ваше приложение. В моем случае сообщение об ошибке ссылается на ConfigurationPermission, поэтому его было легко диагностировать.
Если вы можете определить точные строки в файле web_mediumtrust.config, которые блокируют вас, то, возможно, вы можете поделиться этим со своей хостинговой компанией и иметь больше шансов на решение проблемы.
Больше документации здесь:
http://msdn.microsoft.com/en-us/library/aa302425.aspx
@ Оли, мое приложение размещено на GoDaddy, и мне пришлось делать некоторые обходные пути в коде, когда я начал использовать Lucene.NET. Мне пришлось изменить исходный код Lucene.NET, чтобы не использовать GetTempPath и System.IO.FileInfo.
Кто может быть уверен? Вот почему вы должны разрабатывать с уровнем доверия, установленным в вашем файле web.config.
<trust level="Full|High|Medium|Low|Minimal" />
Большинство совместно используемых хостов не используют истинную среду среднего доверия, потому что она ограничивает некоторые вещи, которые слишком важны. Другие ограничивают некоторые дополнительные настройки по своим собственным анальным причинам.
Лучшее, что вы можете сделать, это спросить своего хоста, какие настройки они используют для ASPNET. Спросите спецификации уровня доверия, который они используют. Узнайте пределы памяти. Получив эти данные, вы сможете повторить сценарий на местном уровне.
Если они не скажут вам, просто установите ваше приложение для работы со средним доверием, но это (очевидно) не обязательно будет работать, если они используют измененный уровень доверия.
Вот некоторая информация о настройке уровней доверия в IIS.
В общем, единственная проблема, с которой я столкнулся, это: если вы отправляете сборки, убедитесь, что вы разрешаете частично доверенные запросы (это метатег сборки), иначе вы не сможете их использовать.
Вот выдержка из информационной страницы GoDaddy's Medium Trust:
Приложения, работающие со средним уровнем доверия, не имеют доступа к реестру, доступа к журналу событий Windows и не могут использовать ReflectionPermission (но могут использовать Reflection). Такие приложения могут взаимодействовать только с определенным диапазоном сетевых адресов, и доступ к файловой системе ограничен иерархией виртуальных каталогов приложения.
Использование среднего уровня доверия предотвращает доступ приложений к общим системным ресурсам и устраняет потенциальные помехи приложениям. Добавление OleDbPermission и OdbcPermission позволяет приложениям использовать этих поставщиков данных для доступа к базам данных. WebPermission изменен, чтобы разрешить исходящий трафик http и https.
Это может не совпадать с тем, что вам придется обойти с вашим хостом (если вы не с GoDaddy), но это типичный пример.
При среднем доверии, по крайней мере на моем хосте, вызовы P/INVOKE недоступны, т.е. [DLLImport]
вызывать COM-компонент не будет работать.
-Edoode
Библиотека system.runtime.serialization полностью недоступна при среднем доверии.
Я написал это для сериализации / десериализации JSON и нашел трудный путь. Потребовалась неделя, чтобы заставить сотрудника подтвердить, что виноваты ограничения среднего доверия. В результате я сменил хостинговую компанию.
Убедитесь, что любые сторонние библиотеки / фреймворки (на ум приходит Castle) собраны (или могут быть собраны) со средним доверием.