Зарегистрированный участник, создайте свою базу данных веб -разработки, предисловие
ASP.NET -это не простое обновление ASP, а важная часть плана Microsoft .NET. Для оконного программирования Windows обеспечивает хороший интерфейс программирования для разработки крупных сетевых приложений и может значительно повысить эффективность работы разработчиков.
Тем не менее, процесс «One -времени преобразования, два компиляции» делает файл ASPX немного неадекватным, когда первое выполнение (или первая операция после обновления), особенно в среде приложения большого количества файлов кода ASPX и CodeHind, компиляция Компиляция файла ASPX он опубликован после DLL (в .NET, известный как набор приложений), исключая время «Один преобразование, одно компиляцию» и частоту использования ЦП, что значительно улучшит общую производительность веб -сервисов. Конечно, после составления в DLL конфиденциальность исходного кода также улучшилась в определенной степени.
Эта статья представляет базовый процесс обработки ASP.NET и анализ секретного открытия. «TRAP», компилирует доступные файлы ASPX с файлом CodeBehind ASPX в процесс DLL. В конце статьи также вводятся советы по фактическому процессу работы.
Поскольку эта статья включает в себя такие понятия, как приложения ASP.NET, компиляция командной строки, файлы конфигурации web.config и т. Д., Чтобы читатели могли лучше понять содержание этой статьи и сделать эту статью больше не накапливаться, Прежде всего, системы, соответствующие этой статье, соответствует соответствующей системе этой статьи.
Системная среда:
Win2000 (SP3) + IIS5 + .NET Framework 1.0 (китайская версия).
Имя сервера:
Поскольку примеры этой статьи протестированы на этой машине, имя сервера локально.
Настройки IIS:
Установите Dlltest виртуального каталога (реальный путь w:/wwwroot/dlltest) и установите его в качестве приложения для создания каталога бина под dlltest. Все исходные файлы будут размещены в каталоге DLLTEST, и все файлы DLL будут размещены в каталоге DLLTEST/BIN.
Файл конфигурации приложения ASP.NET -web.config
Создайте файл web.config в каталоге dlltest.
<?
<Конфигурация>
<System.Web />
</конфигурация>
Командное окно (окно DOS)
Откройте командное окно и используйте команду CD, чтобы сделать текущий каталог как w:/wwwroot/dlltest.
1. Установите отображение от ASPX в DLL
Прежде всего, давайте посмотрим, как файл ASPX обрабатывается ASP.NET:
Когда HTTP -запрос (такой как «http: //webserver/webapp/webpage.aspx») отправляется с клиента на сервер IIS, IIS захватывает и анализирует запрос, и когда он анализирует этот запрос как на страницу ASPX, немедленно Используйте страницу ASPX, чтобы немедленно использовать страницу ASPX. WebApp/webpaage.aspx "существует. Если его не существует, вернитесь к клиенту и вернитесь в ошибку HTTP 404 (файл не найден), в противном случае найдите соответствующий файл DLL во временном каталоге ASP.NET, если он не существует или DLL «старый», чем исходный файл ASPX, вызовите компилятор CSC (если сценарий сервиса ASPX сценария стороной службы ASPX, язык - VB или JScript, то вызывает соответствующий компилятор VBC, JSC Compiler) для компиляции Файл ASPX в DLL, а затем ASP.NET вызывает DLL, чтобы обрабатывать конкретные запросы клиентов и вернуться к ответу на сервер.
Это видно из этого процесса обработки. Итак, есть ли другой способ привести обработку «маршрута» в файл ASPX в скомпилированном DLL? Метод состоит в том, чтобы добавить элементы отображения DLL в раздел Httphandlers в разделе System.Web в разделе System.Web в приложении ASP.NET.
<dd verb =* path = aspx имя файла тип = имя класса, файл dll/>
Файл ASPX: Требуется виртуальное имя «маршрутизации», и расширение должно быть ASPX, в противном случае IIS обработает файл первым в управляемой среде ASP.NET.
Файл DLL: файл DLL (набор приложения) Имя, не нужно вводить ".dll". ASP.NET сначала выполняет поиск DLL в сборе в приложении приложения для приложения приложения, а затем ищет DLL в сборе в кеше кеша системы.
Имя класса: Поскольку один DLL может иметь несколько имен или несколько классов, который класс должен автоматически загружаться при вызовах DLL.
Например, файл web.config определенного приложения ASP.net заключается в следующем:
<?
<Конфигурация>
<System.Web>
<httphandler>
<dd verb =* path = index.aspx type = bbs.indexpage, bbs />
</httphandler>
</ssystem.web>
</конфигурация>
Файл конфигурации сообщает ASP.NET, что, когда клиент запрашивает файл index.aspx этого приложения, напрямую вызывает BBS.DLL в каталоге BIN Application и автоматически загружает класс bbs.indexpage.
2. Разработка может обрабатывать DLL на HTML -странице
Следует отметить, что не все приложения DLL может реализовать режим HTTP -запроса/ответа. Давайте посмотрим на описание «Программа обработки HTTP и завод» в учебном пособии Microsoft ASP.net Fast Entry (http://chs.gotdotnet.com/quickstart/aspplus/):
ASP.NET предоставляет API -интерфейсы запросов/ответов с низким уровнем уровня, позволяя разработчикам использовать класс .NET Framework для предоставления услуг для введенных HTTP -запросов. С этой целью разработчики должны создать класс, который поддерживает интерфейс System.Web.IHTTPHANDLER и реализовать метод ProcessRequest (). При обработке HTTP -запроса не требуется сервис, предоставляемый платформой страницы высокого уровня, программа обработки обычно полезна. Общее использование программ обработки включает экранисты и приложения, аналогичные CGI, особенно те приложения, которые возвращают двоичные данные.
Каждый запрос из HTTP -запроса, полученного ASP.NET, наконец -то обрабатывается конкретным экземпляром класса, который реализует Ihttphandler. IhttphandlerFactory предоставляет структуру, которая обрабатывает фактический анализ запроса URL -адреса экземпляра Ihttphandler. В дополнение к классу по умолчанию ihttphandlerfactory, предоставленного ASP.NET, разработчики также могут выбрать создание и регистрацию фабрик для поддержки большого количества решений для анализа запросов и активации.
Из этого текста можно увидеть, что, когда страница ASPX не включает в себя технологию расширенного интерфейса, предоставляемой .NET Framework (например, кэш данных, сохранение состояния, ссылка управления веб -окном и т. Д.), Особенно при возврате двоичных данных (таковые Как изображения, звуки и т. Д.) Для клиента, вы можете использовать файл приложения. System.Web.IHTTPHANDLER Интерфейс и реализуйте метод ProcessRequest (). Простой пример заключается в следующем:
/* Исходный файл: ex1.cs запускается*/
Использование System.Web;
Пространство имен dlltenst
{{
/*
Класс должен реализовать интерфейс ihttphandler. Если программа будет получить доступ к статусу сеанса, должен быть реализован интерфейс iRequiRessessionState (интерфейс маркера, который не включает никакого метода).
*/
Public Class Ex1 -страница: ihttphandler
{{
/*
Isreasable Attribute сообщает Framework .NET, что эта программа может использоваться несколькими потоками одновременно.
Истина соответствует;
*/
Общественный подъемник
{{
Получить {return true;}
}
/*
Реализуйте метод ProcessRequest и верните данные ответа клиенту.
В этом примере верните простую HTML -страницу к клиенту
*/
Public void ProcessRequest (контекст HTTPContext)
{{
httpresponse res = context.response;
res.write (<html> <body>);
res.write (<h1> dlltest -ex1 (пример 1) </h1> <hr>);
Res.write (эта страница обрабатывается непосредственно DLL);
res.write (</html> </body>);
}
}
}
/* Исходный файл: ex1.cs end*/
В состоянии командной строки следующие команды компиляции компиляют ex1.cs в ex1.dll и храните его в каталоге бин.
CSC /T: Library /Oxin/ex1.dll Ex1.cs
Добавьте сопоставление ASPX-> DLL в файл конфигурации web.config.
<?
<Конфигурация>
<System.Web>
<httphandler>
<Ded verb =* path = dlltest1.aspx type = dlltest.ex1page, ex1 />
</httphandler>
</ssystem.web>
</конфигурация>
Теперь, когда браузер посещает http: //localhost/dlltest/dlltest1.aspx, это на самом деле метод ProcessRessRequest класса DllTest.ex1 -страница в ex1.dll.
В -третьих, составьте один файл ASPX в DLL
Судя по «значению за пределами Microsoft», публично описанным в предыдущем разделе, Microsoft не поддерживает разработчиков для составления файлов ASPX непосредственно в DLL. Тем не менее, ASP.NET Advanced Interface Technology (сервер HTML Control, Web Control и т. Д.) Должна отображаться через файл ASPX. . из.
Теперь успокойся, чтобы проанализировать:
Компилятор CSC - это просто компилятор C#. исходный файл.
Следовательно, для составления файла ASPX в файл DLL файл ASPX должен быть преобразован в исходный файл CS, который может быть распознан компилятором CSC. Итак, какие инструменты используются для конвертации? Хотя я считаю, что этот инструмент должен быть скрыт в .NT Framework, я проверил большое количество публичных документов ASP.NET и .NET.
О, в мире нет способа, и случайная возможность все еще заставляет меня открыть для себя этот секрет.
Посмотрите на исходный файл ex2.aspx:
/* Исходный файл: ex2.aspx start*/
< %@ page language = c# %>
<script runat = server>
/*
Вы читаете это правильно, следующая строка - «Abcdefg».
В тексте я называю эту строку «ловушка кода»
*/
ABCDEFG // Кодовая ловушка
void page_load (Object src, EventArgs args)
{{
if (! ispostback) notlabel.text = Пожалуйста, введите свое имя:;
}
void onnamesubmit (Object src, Eventargs args)
{{
string name = f_name.value;
notlabel.text = (name ==)? Добро пожаловать! ;;
}
</script>
<html>
<тело>
<Form runat = server>
<h1> dlltest -ex2 (пример 2) </h1>
<hr>
<ASP: метка Runat = Server ID = NotLabel Style = Color: Red;
<input runat = идентификатор сервера = f_name size = 8>
<Button Runat = server onserverclick = onnamesubmit> ok </button>
</form>
</body>
</html>
/* Исходный файл: ex2.aspx end*/
Если комментирует или удаляет «Кодовая ловушка», то Ex2.aspx - это простой файл ASP.NET.
Теперь давайте откроем «ловушку» и посмотрим, что вернул ASP.NET?
Вернули страницу «Ошибка компиляции», и исходные файлы отчета не могут быть скомпилированы. Что интересно, чтобы быть заинтересованным, так это гиперссылка под названием «Показать полный источник компиляции» в нижней части страницы. Удалите эту часть «полного источника компиляции» и удалите информацию о номере предыдущей строки и некоторые другие компиляционные переключатели (в основном #line Compility) и закройте симпатичную «ловушку кода», которую он также удаляет), а после завершения сохраните его как ex2_aspxx .cs:
/* Исходный файл: ex2_aspx.cs start*/
/*
Из приведенного ниже описания можно увидеть, что действительно существует непрерывный инструмент для завершения преобразования файла ASPX в исходный файл CS
*/
// ------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ --------------------- ------------------------------------- -------------------------------------------
// <Emutogenerate>
// Этот код был сгенерирован тоже.
// версия времени выполнения: 1.0.3705.0
//
// Приходы к этому файлу могут заботиться о неправильном поведении и будут потеряны, если
// код восстанавливается.
// </autogenerate>
// ------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ --------------------- ------------------------------------- -------------------------------------------
/*
Странно: пространство именования на самом деле ASP вместо ASPX
Рекомендуется изменить имя на имя, подходящее для приложений, чтобы предотвратить конфликт именования, например, для этой статьи вы можете изменить на dlltest
Я не изменился здесь, чтобы позволить всем видеть его оригинальный вид
*/
пространство имен asp {
Использование системы;
Использование System.collections;
Использование System.collections.specialized;
Использование System.configuration;
Использование System.Text;
Использование System.Text.regulareXpressions;
Использование System.Web;
Использование System.Web.Caching;
Использование System.Web.SessionState;
Использование System.Web.Security;
Использование System.Web.UI;
Использование System.Web.UI.WebControls;
Использование System.web.ui.htmlControls;
/*
1. Обратите внимание на состав имени класса.
2. Обратите внимание на базовый класс. System.Web.UI.PAGE реализует интерфейс IHTTPHANDLE.
*/
открытый класс ex2_aspx: system.web.ui.page, system.web.sessionState.irekiressenerationstate {
Частный статический int __autohandler;
Защищенная система.web.ui.webcontrols.label notelabel;
Защищенная система.web.ui.htmlcontrols.htmlinputtext f_name;
Защищенная система.web.ui.htmlcontrols.htmlbutton __control3;
Защищенная система.web.ui.htmlcontrols.htmlform __control2;
Частный статический Bool __intialized = false;
Private Static System.collection.arraylist __filEdePendences;
/* Теперь вы можете выключить «ловушку»*//
// ABCDEFG
void page_load (Object src, EventArgs args)
{{
if (! ispostback) notlabel.text = Пожалуйста, введите свое имя:;
}
void onnamesubmit (Object src, Eventargs args)
{{
string name = f_name.value;
notlabel.text = (name ==)? Добро пожаловать! ;;
}
/* Функция строительства*/
public ex2_aspx () {
System.collections.Arraylist зависимости;
if (asp.ex2_aspx .__ Intialize == false) {{{
зависимости = new System.collections.arraylist ();
/*
Следующие строки должны быть аннотированы таким образом, чтобы DLL стал независимым независимым файлом
Предотвратить новое и старое из его файлов "зависимости" при запуске DLL
*/
//Dependencies.add (w: //wwwroot/dlltest/ex2.aspx);
asp.ex2_aspx .__ falledependences = зависимости;
asp.ex2_aspx .__ Intialized = true;
}
}
Защищенный переопределение int autohandler {
получать {
Вернуть asp.ex2_aspx .__ autohandler;
}
набор {
asp.ex2_aspx ._ autohandlers = value;
}
}
Защищенная система.web.httpage ApplicationInstance {
получать {
Return ((system.web.httpapplication) (this.context.applicationInstance));
}
}
Public переопределить String Templatesourcederectory {
получать {
Return /dlltest;
}
}
Private System.web.ui.control __buildControlNoteLabel () {
System.web.ui.webcontrols.label __ctrl;
__ctrl = new System.web.ui.webcontrols.label ();
this.notlabel = __ctrl;
__Ctrl.id = notelabel;
(System.Web.UI.IattributeAccessor) (__ Ctrl).
Вернуть __ctrl;
}
Private System.web.ui.control __buildControff_name () {
System.web.ui.htmlcontrols.htmlinputtext __ctrl;
__ctrl = new System.web.ui.htmlcontrols.htmlinputtext ();
this.f_name = __ctrl;
__ctrl.id = f_name;
__ctrl.size = 8;
Вернуть __ctrl;
}
Private System.web.ui.control __buildControl__Control3 () {{)
System.web.ui.htmlcontrols.htmlbutton __ctrl;
__ctrl = new System.web.ui.htmlcontrols.htmlbutton ();
это .__ Control3 = __ctrl;
System.web.ui.iparseraccessor __parser = (System.Web.UI.IPARSERACCOSOR) (__CTRL));
__parser.addparsedsubobocte (new System.web.ui.literalControl (OK));
__Ctrl.serverclick += new System.eventhandler (this.onnamebmit);
Вернуть __ctrl;
}
Частная система.web.ui.control
System.web.ui.htmlcontrols.htmlform __ctrl;
__ctrl = new System.web.ui.htmlcontrols.htmlform ();
это .__ Control2 = __ctrl;
System.web.ui.iparseraccessor __parser = (System.Web.UI.IPARSERACCOSOR) (__CTRL));
__Parser.addparsedsubobobject (new System.web.ui.literalControl (/r/n <h1> dlltest -ex2 (пример 2) </h1>/r/n <hr>/r/n)))
это .__ BuildControlNoteLabel ();
__parser.addparsedsubobocte (this.notelabel);
__Parser.addparsedsubobobject (new System.web.ui.literalControl (/r/n));
это .__ BuildControff_name ();
__parser.addparsedsubobobject (this.f_name);
__Parser.addparsedsubobobject (new System.web.ui.literalControl (/r/n));
это .__ BuildControl__Control3 ();
__Parser.addparsedsuboboct (this .___ control3);
__Parser.addparsedsubobobject (new System.web.ui.literalControl (/r/n));
Вернуть __ctrl;
}
Private void __buildControltree (System.Web.ui.control __ctrl) {
System.web.ui.iparseraccessor __parser = (System.Web.UI.IPARSERACCOSOR) (__CTRL));
__parser.addparsedsubobobject (new System.web.ui.literalControl (/r/n/r/n <html>/r/n << body>/r/n));
это .__ BuildControl__Control2 ();
__Parser.addparsedsubobobject (this .___ control2);
__Parser.addparsedsubobobject (new System.web.ui.literalControl
}
Защищенное переопределение void frameworkInitialize () {
это .__ BuildControltree (это);
this.filedEpendences = asp.ex2_aspx .__ FalledEpendences;
this.EnableViewStatemac = true;
}
public override int gettypehashcode () {) {)
Возврат -11574299;
}
}
}
/* Исходный файл: ex2_aspx.cs end*/
Я полагаю, что после анализа этого файла у вас будет дальнейшее понимание принципа работы ASP.NET (не имеет ничего общего с этой статьей, необоснованной).
В состоянии командной строки следующие команды компиляции компиляют ex2_aspx.cs в ex2.dll и храните в каталоге бин.
CSC /T: Library /Oxin/ex2.dll ex2_aspx.cs
Добавьте сопоставление ASPX-> DLL в файл конфигурации web.config, то есть добавить следующие строки в httphandlers в разделе System.Web:
<Derb =* path = dlltest2.aspx type = asp.ex2_aspx, ex2 />
Теперь, когда браузер посещает http: //localhost/dlltest/dlltest2.aspx, это похоже на доступ к Ex2.aspx. Конечно, даже если Ex2.aspx не существует, или он был обновлен, он не окажет никакого влияния на доступ к странице, если только Bin/ex2.dll не будет повторно.
В -четвертых, составьте файл ASPX CodeBehind в DLL
Для составления файла CodeBehind ASPX в DLL принцип преобразования файла ASPX в исходный файл CS такой же, как и выше. как исходный файл CS. Разница в том, что шаги при составлении в DLL: (для удобства повествования, предполагая, что интерфейс -файл является ex3.aspx, файл CodeBehind IS ex3.aspx.cs, а «полное источник компиляции» ex3.aspx сохраняется как как ex3_aspx.cs))
Шаг 1: Сначала используйте следующую команду для компиляции ex3.aspx.cs в bin/ex3.aspx.cs.dll
CSC /T: Library /Oxin/ex3.aspx.cs.dll Ex3.aspx.cs
Шаг 2: Используйте следующую команду для компиляции ex3_aspx.cs в bin/ex3.dll
CSC /T: Library /r:bin/ex3.aspx.cs.dll /out:bin/ex3.dll ex3_aspx.cs
Затем добавьте сопоставление ASPX-> DLL в файл конфигурации web.config, то есть добавьте следующие строки в Httphandlers в разделе System.Web:
<добавить verb =* path = dlltest3.aspx type = asp.ex3_aspx, ex3 />
Теперь откройте браузер и посетите http: //localhost/dlltest/dlltest3.aspx.
Пять, небольшой трюк
При настройке «TRAP» для преобразования файла ASPX в исходный файл CS обычно используйте метод копирования и вставки для сохранения «полного источника компиляции» в блокноте или VS.NET или другой среде разработки ASP.NET, а затем сохранить это после завершения сохранения для исходных файлов CS.
Организация предназначена для удаления информации о номере линии вставки и инструкции по компиляции "#line". Если эта информация будет удалена вручную, она будет слишком неприятной.
Один из уловок, которые я использую: в ноутбуке используйте метод замены для быстрого организации. Используйте строку/*, чтобы заменить все строки, используйте:*/для замены All:, используйте // #line Lines для замены всех #line, после завершения замены, аннотируйте «ловушку кода», установите настройки функции основного класса структуры , установите настройки основной функции конструктора. Аннотируются предложения «файлов зависимости», поэтому даже если завершение завершена.