Общие папки кода на веб-узлах ASP.NET
Обновлен: Ноябрь 2007
Если создаваемое веб-приложение содержит код, который нужно использовать в нескольких страницах, то можно сохранить код в одной или двух особых папках ниже корня этого веб-приложения, а именно папках Bin и App_Code. Если разработчик создает эти папки и размещает в них файлы определенных типов, ASP.NET обрабатывает эти файлы особым образом.
Папка Bin
Можно сохранить компилированные сборки в папке Bin, и другой код в любом месте веб-приложения (например код для страниц) автоматически будет ссылаться на эти сборки. Типичным примером является использование компилированного кода настраиваемого класса. Можно скопировать скомпилированную сборку в папку Bin веб-приложения, и после этого класс становится доступным всем страницам.
Сборки в папке Bin не требуют регистрации. Присутствие DLL-файла в папке Bin достаточно, для его распознавания в ASP.NET. Если разработчик изменяет DLL-файл и записывает его новую версию в папку Bin, ASP.NET обнаруживает обновление и с этого момента использует новую версию DLL-файла для новых запросов страниц.
Безопасность при использовании папки Bin
Размещение скомпилированных сборок в папке Bin может представлять определенную угрозу безопасности. Если разработчик создает и компилирует код самостоятельно, ему известно, что делает этот код. Но к скомпилированному коду в папке Bin следует относиться точно так же, как и к любому исполняемому коду. Следует осторожно относиться к скомпилированному коду, пока код не будет проверен и не станет ясно, что он делает.
При размещении скомпилированного кода в папке Bin обратите внимание на следующие аспекты безопасности:
Область действия сборок в папке Bin ограничена текущим приложением. Следовательно, у них отсутствует возможность доступа к ресурсам или вызова кода вне текущего веб-приложения.
Во время выполнения уровни доступа для сборки определяются уровнем доверия, заданным на локальном компьютере. Дополнительные сведения см. в разделе Уровни доверия и файлы политик ASP.NET.
Если разработчик работает в среде разработки, такой как Visual Studio, то код в папке Bin выполняется в другом контексте, чем во время выполнения. Например, код может выполняться с полным доверием.
Папка App_Code
Исходный код можно сохранить в папке App_Code, и он будет автоматически скомпилирован во время выполнения. Полученная сборка будет доступна любому коду в веб-приложении. Следовательно, использование папки App_Code folder во многом похоже на использование папки Bin с тем исключением, что можно сохранить исходный, а не скомпилированный код. Папка App_Code и ее особое положение в веб-приложении ASP.NET позволяют создавать настраиваемые классы и другие файлы с исходным кодом и использовать их в создаваемом веб-приложении без необходимости их независимой компиляции.
Папка App_Code может содержать файлы исходного кода, написанные как традиционные файлы классов — то есть файлы с расширением VB, расширением CS и так далее. Но эта папка также может содержать файлы, для которых конкретный язык программирования явно не указан. Среди примеров таких файлов — WSDL-файлы языка WSDL и файлы XML-схем (XSD). ASP.NET может компилировать эти файлы в сборки.
Папка App_Code может содержать столько файлов и вложенных папок, сколько нужно разработчику. Разработчик может структурировать исходный код любым удобным для него способом, и ASP.NET, тем не менее, скомпилирует весь кода в одну сборку, доступную любому коду из любого места веб-приложения.
![]() |
---|
Пользовательские элементы управления нельзя помещать в папку App_Code. В их число входят как пользовательские элементы управления в виде одиночных файлов, так и пользовательские элементы управления, использующие модель кода программной части. Помещение пользовательского элемента управления в каталог App_Code приведет к компиляции кода пользовательского элемента управления вне необходимой последовательности и, поэтому, запрещено. Обратите внимание, что пользовательские элементы управления не обязаны находиться в папке App_Code — они уже доступны страницам в любом месте приложения. |
Определение языка программирования папки App_Code Folder
Папка App_Code folder не помечается явно как папка, содержащая файлы, написанные на каком-либо конкретном языке программирования. Вместо этого ASP.NET определяет компилятор, вызываемый для папки App_Code, в зависимости от содержащихся в ней файлов. Если папка App_Code содержит VB-файлы, то ASP.NET использует компилятор Visual Basic. Если она содержит CS-файлы, то ASP.NET использует компилятор C# и т. д.
Если папка App_Code содержит только файлы, язык программирования которых неоднозначен, например WSDL-файл, то ASP.NET использует компилятор по умолчанию для веб-приложений, определенный в элементе compilation файла конфигурации веб-приложения или компьютера.
Несколько языков программирования в папке App_Code
Так как исходный код в папке App_Code компилируется в одну сборку, все файлы в папке App_Code должны быть написаны на одном и том же языке программирования. Например, папка App_Code не может содержать исходный код и на Visual Basic, и на C#.
Но разработчик можно настроить свое веб-приложение так, чтобы оно считало папки, вложенные в папку App_Code, отдельными компилируемыми единицами. В этом случае каждая папка может содержать исходный код на своем языке программирования. Такая конфигурация задается путем создания элемента codeSubDirectories в элементе compilation файла Web.config и добавления ссылки на вложенную папку. В следующем примере показывается, как можно настроить вложенные папки VBCode и CSCode для компиляции в отдельные сборки:
<compilation debug="false">
<codeSubDirectories>
<add directoryName="VBCode" />
<add directoryName="CSCode" />
</codeSubDirectories>
</compilation>
Ссылки на вложенные папки VBCode и CSCode не обязаны содержать сведения о языке программирования, использованном для этой вложенной папки. Как и в случае с папкой App_Code, ASP.NET определяет используемый компилятор на основе анализа файлов в этой вложенной папке.
Безопасность при использовании папки App_Code
Проблемы безопасности кода в папке App_Code в основном совпадают с проблемами для папки Bin — код компилируется в сборку во время выполнения. Смягчающим фактором для разработчика является возможность считать исходный код в файлах в папке App_Code. Но если код не является полностью понятным, то он продолжает представлять угрозу безопасности. Следовательно, следует относиться к исходному коду в папке App_Code точно так же, как к скомпилированному коду из того же источника.