등록 된 회원, 웹 개발 데이터베이스, 서문 작성
ASP.NET은 ASP의 간단한 업그레이드가 아니라 Microsoft .NET 계획의 중요한 부분입니다. Windows의 Window 프로그래밍에는 대형 네트워크 응용 프로그램 기능 개발을위한 훌륭한 프로그래밍 인터페이스를 제공하며 개발자의 작업 효율성을 크게 향상시킬 수 있습니다.
그러나 "1- 시간 변환, 두 컴파일"프로세스는 특히 ASPX 파일이 첫 번째 실행 (또는 업데이트 후 첫 번째 조작), 특히 다수의 ASPX 및 CodeHind 코드 파일의 응용 프로그램 환경에서 컴파일 할 때 ASPX 파일이 약간 부적절하게 나타납니다. ASPX 파일 컴파일은 DLL (.NET에서 응용 프로그램 세트로 알려진 .NET)에 게시되어 "하나의 변환, 하나의 컴파일"및 CPU 사용률의 시간을 제거하여 웹 서비스의 전반적인 성능을 크게 향상시킵니다. 물론, DLL으로 컴파일 된 후 소스 코드의 기밀성도 어느 정도 향상되었습니다.
이 기사는 ASP.NET의 기본 처리 프로세스와 비밀 검색 분석을 소개합니다. ASP.NET에서 ASPX에서 DLL 매핑을 설정하는 방법, HTTP 요청/응답을 처리하는 방법 및 설정 방법을 소개합니다. ""Trap "은 CodeBehind의 ASPX 파일을 사용하여 사용 가능한 ASPX 파일을 DLL 프로세스로 컴파일합니다. 기사의 끝에서 실제 작동 프로세스에 대한 팁도 도입됩니다.
이 기사는 ASP.NET 응용 프로그램, 명령 줄 컴파일, web.config 구성 파일 등과 같은 개념이 포함되므로 독자 가이 기사의 내용을 더 잘 이해 하고이 기사를 더 이상 축적하지 않도록하기 위해. 우선이 기사에 해당하는 모든 시스템은이 기사의 해당 시스템에 해당합니다.
시스템 환경 :
Win2000 (SP3) + IIS5 + .NET 프레임 워크 1.0 (중국어 버전).
서버 이름 :
이 기사의 예제는이 컴퓨터에서 테스트되므로 서버 이름은 LocalHost입니다.
IIS 설정 :
가상 디렉토리 dlltest (실제 경로는 w :/wwwroot/dlltest)를 설정하고 dlltest 아래에서 빈 디렉토리를 만들기위한 응용 프로그램으로 설정하십시오. 모든 소스 파일은 DLLTEST 디렉토리에 배치되며 모든 DLL 파일은 DLLTEST/BIN 디렉토리에 배치됩니다.
ASP.NET 응용 프로그램 구성 파일 -web.config
dlltest 디렉토리에서 web.config 파일을 만듭니다. 파일의 내용은 다음과 같습니다.
<? xml 버전 = 1.0?>
<구성>
<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/webpage.aspx"는 ASP.NET 운영 환경 (ASPNET_WP.EXE)을 호출하고 ASP.NET 환경이 시작된 후 "/를 확인하십시오. WebApp/WebPaage.aspx "존재합니다. 존재하지 않는 경우 클라이언트로 돌아가서 HTTP 404 (파일을 찾을 수 없음) 오류로 돌아가십시오. 그렇지 않으면 존재하지 않는 경우 ASP.NET의 임시 디렉토리에서 해당 DLL 파일을 찾으십시오. 또는 DLL은 ASPX 소스 파일보다 "이전"인 경우 CSC 컴파일러를 호출합니다 (ASPX의 서비스 측면 스크립트가 vb 또는 jscript 인 경우 해당 VBC 컴파일러 JSC 컴파일러를 호출) ASPX 파일로 DLL을 한 다음 ASP.NET은 DLL을 호출하여 특정 고객 요청을 처리하고 서버 응답으로 돌아갑니다.
이 처리 프로세스에서 일반적으로 ASP.NET 운영 환경이 ASPX에 해당하는 DLL을 자동으로 식별, 확인 및 업데이트합니다. 그렇다면 "경로"를 ASPX 파일로 컴파일 된 DLL로 처리하는 다른 방법이 있습니까? 이 방법은 System.web 섹션의 httphandlers 섹션에서 ASP.NET 응용 프로그램의 httphandlers 섹션에서 ASPX에 DLL 매핑 항목을 추가하는 것입니다.
<dd 동사 =* path = aspx 파일 이름 유형 = 클래스 이름, dll 파일/>
ASPX 파일 : "라우팅"의 가상 이름이 필요하며 확장자는 ASPX 여야합니다. 그렇지 않으면 IIS가 ASP.NET 실행 환경에서 파일을 먼저 처리합니다.
DLL 파일 : DLL 파일 (응용 프로그램 세트) 이름, ".dll"을 입력 할 필요가 없습니다. ASP.NET는 먼저 응용 프로그램 응용 프로그램 응용 프로그램의 응용 프로그램에서 어셈블리 DLL을 검색 한 다음 시스템 세트 캐시 캐시에서 어셈블리 DLL을 검색합니다.
클래스 이름 : 하나의 DLL에 여러 이름 또는 여러 클래스가있을 수 있으므로 DLL을 호출 할 때 클래스를 자동으로로드해야합니다.
예를 들어, 특정 ASP.NET 응용 프로그램의 web.config 파일은 다음과 같습니다.
<? xml 버전 = 1.0?>
<구성>
<System.Web>
<httphandler>
<dd 동사 =* path = index.aspx type = bbs.indexpage, bbs />
</httphandler>
</ssystem.web>
</구성>
구성 파일은 클라이언트 가이 응용 프로그램의 index.aspx 파일을 요청할 때 응용 프로그램 빈 디렉토리에서 bbs.dll을 직접 호출하고 BBS.IndExPage 클래스를 자동으로로드한다는 것을 ASP.net에게 알려줍니다.
2. 개발은 HTML 페이지의 DLL을 처리 할 수 있습니다.
모든 응용 프로그램 DLL이 HTTP 요청/응답 모드를 구현할 수있는 것은 아닙니다. Microsoft ASP.NET Fast Entry Tutorial (http://chs.gotdotnet.com/quickstart/aspplus/)의 "HTTP Processing Program and Factory"에 대한 설명을 살펴 보겠습니다.
ASP.NET은 낮은 레벨 요청/응답 API를 제공하므로 개발자는 .NET Framework 클래스를 사용하여 도입 된 HTTP 요청에 서비스를 제공 할 수 있습니다. 이를 위해 개발자는 System.web.ihttphandler 인터페이스를 지원하는 클래스를 만들고 processRequest () 메소드를 구현해야합니다. HTTP 요청을 처리 할 때는 높은 수준의 페이지 프레임 워크에서 제공하는 서비스가 필요하지 않으면 처리 프로그램이 일반적으로 유용합니다. 일반적인 처리 프로그램의 일반적인 사용에는 CGI와 유사한 스크린 및 응용 프로그램, 특히 이진 데이터를 반환하는 응용 프로그램이 포함됩니다.
ASP.NET가받은 HTTP 요청의 각 요청은 최종적으로 IHTTPHANDLER를 구현하는 클래스의 특정 인스턴스에 의해 처리됩니다. ihttphandlerfactory는 ihttphandler 인스턴스 URL 요청의 실제 분석을 처리하는 구조를 제공합니다. ASP.NET에서 제공하는 기본 ihttphandLerfactory 클래스 외에도 개발자는 많은 요청 분석 및 활성화 솔루션을 지원하기 위해 공장을 만들고 등록하도록 선택할 수도 있습니다.
이 텍스트에서 ASPX 페이지에 .NET 프레임 워크가 제공하는 고급 인터페이스 기술 (예 : 데이터 캐시, 상태 유지, 웹 창 제어 참조 등)이 포함되지 않으면 특히 바이너리 데이터를 반환 할 때 (예 : 클라이언트의 사진, 사운드 등으로서. System.web.ihttphandler 인터페이스 및 ProcessRequest () 메소드를 구현하십시오. 간단한 예는 다음과 같습니다.
/* 소스 파일 : Ex1.cs 시작*/
System.Web 사용;
네임 스페이스 dlltenst
{{
/*
클래스는 ihttphandler 인터페이스를 구현해야합니다. 프로그램이 세션 상태에 액세스하는 경우 iRequiressessionState 인터페이스를 구현해야합니다 (메소드가 포함되지 않은 마커 인터페이스).
*/
공개 클래스 ex1page : ihttphandler
{{
/*
isreusable 속성은 .NET 프레임 워크 에이 프로그램이 여러 스레드에서 동시에 사용할 수 있음을 알려줍니다.
참으로, 거짓이 일치하는지 여부는 참으로 해당합니다.
*/
공개 부실이 있습니다
{{
{return true;} get get
}
/*
ProcessRequest 메소드를 구현하고 응답 데이터를 클라이언트에 반환하십시오.
이 예에서는 간단한 HTML 페이지를 클라이언트에게 반환합니다.
*/
Public Void ProcessRequest (HTTPContext Context)
{{
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로 컴파일하여 BIN 디렉토리에 저장합니다.
CSC /T : Library /Oxin/ex1.dll ex1.cs
구성 파일에 ASPX-> DLL 매핑을 추가 한 후 Web.Config는 다음과 같습니다.
<? xml 버전 = 1.0?>
<구성>
<System.Web>
<httphandler>
<ded verb =* path = dlltest1.aspx type = dlltest.ex1page, ex1 />
</httphandler>
</ssystem.web>
</구성>
브라우저가 http : //localhost/dlltest/dlltest1.aspx를 방문하면 실제로 ex1.dll에서 dlltest.ex1page 클래스의 ProcessRessRequest 메소드입니다.
셋째, 단일 ASPX 파일을 DLL로 컴파일하십시오
Microsoft는 이전 섹션에서 공개적으로 설명 된 "Microsoft 외부의 의미"로부터 판단하여 개발자가 ASPX 파일을 DLL로 직접 컴파일하도록 지원하지 않습니다. 그러나 ASP.NET Advanced Interface 기술 (서버 HTML 제어, 웹 제어 등)은 DLL의 작동 효율성을 위해 ASPX의 고급 특성을 포기하면 분명히 손실을 잃어야합니다. . 의.
이제 분석하기 위해 진정하십시오.
CSC 컴파일러는 C#언어 사양을 충족하는 파일 만 컴파일 할 수 있으며 ASPX 파일의 형식은 C#언어 사양을 준수하지 않으므로 CSC 컴파일러는 ASPX를 컴파일 할 수 없습니다. 소스 파일.
따라서 ASPX 파일을 DLL 파일로 컴파일하려면 ASPX 파일을 CSC 컴파일러에서 인식 할 수있는 CS 소스 파일로 변환해야합니다. 그렇다면 전환하는 데 어떤 도구가 사용됩니까? 이 도구는 .nt 프레임 워크에 숨겨져 있어야한다고 생각하지만 정보는 많은 ASP.NET 및 .NET 공개 문서 및 참조 매뉴얼을 확인했습니다.
오, 세상에가는 방법이 없으며 우발적 인 기회로 인해 여전히이 비밀을 발견하게됩니다.
소스 파일 ex2.aspx를 살펴보십시오 :
/* 소스 파일 : Ex2.aspx 시작*/
< %@ 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)
{{
문자열 이름 = f_name.value;
notlabel.text = (name ==)가 비어있을 수 없습니까? 환영! ;;
}
</스크립트>
<html>
<body>
<form runat = server>
<h1> dlltest -ex2 (예 2) </h1>
<HR>
<ASP : LABEL RUNAT = SERVER ID = NOTLABEL 스타일 = 색상 : FONT-WEIGHT : BOLD />
<입력 runat = 서버 id = f_name size = 8>
<버튼 runat = 서버 onserverclick = onnamesubmit> ok </button>
</form>
</body>
</html>
/* 소스 파일 : ex2.aspx end*/
"코드 트랩"주석 또는 삭제되면 Ex2.ASPX는 간단한 ASP.NET 파일입니다.이 페이지는 정상적으로 작동 할 수 있습니다.
이제 "트랩"을 열고 ASP.NET이 무엇을 반환했는지 살펴 보겠습니다.
"컴파일 오류"페이지를 반환했으며 보고서 소스 파일을 컴파일 할 수 없습니다. 흥미로운 점은 페이지 하단의 "완전한 컴파일 소스 표시"라는 하이퍼 링크가 ex2.aspx ( "Complete Compilation Source")에서 변환 된 링크를 클릭하십시오. "완전한 컴파일 소스"의이 부분을 제거하고 이전 줄 번호 정보 및 기타 컴파일 스위치 (주로 #Line Compile 명령)를 제거하고 귀여운 "코드 트랩"도 닫고 마무리 한 후 EX2_ASPX로 저장하십시오. .CS :
/* 소스 파일 : EX2_ASPX.CS 시작*/
/*
아래 설명에서 ASPX 파일을 CS 소스 파일로 전환하는 중단없는 도구가 있음을 알 수 있습니다.
*/
// ---------------------------------------------------- --------------------------------------------------------- --------------------------------------------------------- ------------------------------------------------------ ---------------------------------------------------
// <emutogenerate>
//이 코드도 A에 의해 생성되었습니다.
// 런타임 버전 : 1.0.3705.0
//
//이 파일에 대한 징호는 잘못된 동작에 관심이있을 수 있으며
// 코드가 재생됩니다.
// </자가 생성>
// ---------------------------------------------------- --------------------------------------------------------- --------------------------------------------------------- ------------------------------------------------------ ---------------------------------------------------
/*
이상하게도 : 이름 지정 공간은 실제로 ASPX 대신 ASP입니다
이 기사와 같이 명명 충돌을 방지하기 위해 응용 프로그램에 적합한 이름으로 이름을 변경하는 것이 좋습니다.
나는 모든 사람들이 원래의 모습을 볼 수 있도록 여기서 바뀌지 않았습니다.
*/
네임 스페이스 ASP {
시스템 사용;
시스템 사용;
시스템 사용.
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는 IHTTPHANDLER 인터페이스를 구현합니다.
*/
공개 클래스 EX2_ASPX : System.Web.ui.Page, System.Web.SessionState.ireQuiressEnerationState {
개인 정적 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;
개인 정적 시스템 .collections.arraylist __filedependencies;
/* 이제 "트랩"*/를 끌 수 있습니다.
// abcdefg
void page_load (Object SRC, EventArgs Args)
{{
if (! ispostback) notlabel.text = 이름을 입력하십시오 :;
}
void onnamesubmit (Object SRC, EventArgs Args)
{{
문자열 이름 = 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 .__ FILEDENCENTICE = 종속성;
asp.ex2_aspx .__ intialized = true;
}
}
보호 된 재정의 int autohandler {
얻다 {
ASP.EX2_ASPX .__ AUTOHANDLER 리턴;
}
세트 {
ASP.EX2_ASPX ._ AUTOHANDLERS = 값;
}
}
Protected System.Web.httPage ApplicationInstance {
얻다 {
return ((system.web.httpapplication) (this.context.applicationInstance);
}
}
공개 재정의 문자열 templatesourcedirectory {
얻다 {
반환 /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 = 노텔 라벨;
(System.web.ui.iattributeAccessor) (__ ctrl) (스타일, 색상; font-weight : black);
__ctrl을 반환합니다.
}
Private System.web.ui.control __buildcontrolf_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.iparserAccessor) (__ctrl));
__PARSER.ADDPARSEDSUBOBJECT (new System.Web.ui.literalControl (OK));
__ctrl.serverclick += new System.eventhandler (this.onnamesubmit);
__ctrl을 반환합니다.
}
Private System.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.iparserAccessor) (__ctrl));
__PARSER.ADDPARSEDSUBOBJECT (new System.Web.ui.literalControl (/r/n <h1> dlltest -ex2 (예제 2) </h1>/r/n <hr>/r/n))
this .__ buildControlNotelabel ();
__parser.addparsedSubobject (this.notelabel);
__PARSER.ADDPARSEDSUBOBJECT (new System.Web.ui.literalControl (/r/n));
this .__ buildControlf_name ();
__PARSER.ADDPARSEDSUBOBJECT (this.f_name);
__PARSER.ADDPARSEDSUBOBJECT (new System.Web.ui.literalControl (/r/n));
this .__ buildControl__Control3 ();
__parser.addparsedSubobject (this .___ control3);
__PARSER.ADDPARSEDSUBOBJECT (new System.Web.ui.literalControl (/r/n));
__ctrl을 반환합니다.
}
private void __buildcontroltree (System.Web.ui.control __ctrl) {
System.web.ui.iparseraccessor __parser = (System.Web.ui.iparserAccessor) (__ctrl));
__PARSER.ADDPARSEDSUBOBJECT (new System.Web.ui.literalControl (/r/n/r/n <html>/r/n <body>/r/n);
this .__ buildControl__Control2 ();
__parser.addparsedSubobject (this .___ control2);
__PARSER.ADDPARSEDSUBOBJECT (new System.Web.ui.literalControl
}
보호 된 재정의 void frameworkinitialize () {
이 .__ buildControlTree (this);
this.FileDependencies = asp.ex2_aspx .__ filedependencies;
this.enableViewStatemac = true;
}
int gettypehashcode () {) {)
반품 -11574299;
}
}
}
/* 소스 파일 : ex2_aspx.cs end*/
이 파일을 분석 한 후에는 ASP.NET 작동의 원칙을 더 이해하게 될 것이라고 생각합니다 (이 기사와 관련이 없음).
명령 줄 상태에서 다음 컴파일 명령은 ex2_aspx.cs를 ex2.dll로 컴파일하여 빈 디렉토리에 저장합니다.
CSC /T : 라이브러리 /옥신/ex2.dll ex2_aspx.cs
구성 파일 Web.config에 aspx-> dll 매핑을 추가하십시오. 즉, System.web 섹션의 httphandlers에 다음 줄을 추가하십시오.
<derb =* path = dlltest2.aspx type = asp.ex2_aspx, ex2 />
이제 브라우저가 http : //localhost/dlltest/dlltest2.aspx를 방문하면 ex2.aspx에 액세스하는 것과 같습니다. 물론, ex2.aspx가 존재하지 않거나 업데이트 된 경우에도 bin/ex2.dll이 다시 생성되지 않는 한 페이지 액세스에 영향을 미치지 않습니다.
넷째, CodeBehind의 ASPX 파일을 DLL로 컴파일하십시오
CodeBehind의 ASPX 파일을 DLL로 컴파일하려면 ASPX 파일을 CS 소스 파일로 변환하는 원리는 위와 동일합니다. CS 소스 파일로. 차이점은 DLL으로 컴파일 된 단계입니다. ex3_aspx.cs)))
1 단계 : 먼저 다음 명령을 사용하여 ex3.aspx.cs를 bin/ex3.aspx.cs.dll로 컴파일합니다.
CSC /T : 라이브러리 /옥신/ex3.aspx.cs.dll ex3.aspx.cs
2 단계 : 다음 명령을 사용하여 ex3_aspx.cs를 bin/ex3.dll로 컴파일합니다.
CSC /T : 라이브러리 /r:Bin/ex3.aspx.cs.dll /out:bin/ex3.dll ex3_aspx.cs
그런 다음 구성 파일 Web.config에 aspx-> dll 매핑을 추가합니다. 즉, System.web 섹션의 httphandlers에 다음 줄을 추가하십시오.
<동사 추가 =* path = dlltest3.aspx type = asp.ex3_aspx, ex3 />
이제 브라우저를 열고 http : //localhost/dlltest/dlltest3.aspx를 방문하십시오.
다섯, 약간의 속임수
ASPX 파일을 CS 소스 파일로 변환하도록 "트랩"을 설정할 때 일반적으로 복사 및 붙여 넣기 메소드를 사용하여 메모장 또는 vs.net 또는 기타 ASP.NET 개발 환경에서 "컴파일 소스"를 저장 한 다음 저장하십시오. CS 소스 파일 보존을 마친 후.
조직은 페이스트의 줄 번호 정보와 "#line"컴파일 명령을 제거하는 것입니다. 이 정보가 수동으로 삭제되면 Ex2.ASPX와 같은 간단한 파일조차도 약 270 줄의 "완전한 컴파일 소스"를 생성합니다.
내가 사용하는 트릭 중 하나는 다음과 같습니다. 노트북에서 교체 방법을 사용하여 신속하게 구성하십시오. /* 라인을 사용하여 모든 줄을 교체하기 위해 :*/모든 것을 교체하려면 :, // #line 라인을 사용하여 모든 #line을 교체하기 위해, 교체가 완료된 후 "코드 트랩"에 주석을 달고 메인 클래스 구조 기능 설정을 설정하십시오. , 기본 생성자 함수의 설정을 설정하십시오.