登録メンバー、Web開発データベースの作成、序文
ASP.NETは、ASPの単純なアップグレードではなく、Microsoft .NETプランの重要な部分です。 Windowsのウィンドウプログラミングには、大規模なネットワークアプリケーション機能を開発するための優れたプログラミングインターフェイスを提供し、開発者の作業効率を大幅に改善できます。
ただし、「1回の変換、2つのコンピレーション」プロセスにより、特に多数のASPXおよびCodeHindコードファイルのアプリケーション環境で、最初の実行(または更新後の最初の操作)がコンパイルされると、ASPXファイルがわずかに不十分に見えます。 ASPXファイルコンパイルは、DLL(アプリケーションセットとして知られる.NET)の後に公開され、「1つの変換、1つのコンピレーション」とCPU使用率の時間を排除し、Webサービスの全体的なパフォーマンスを大幅に改善します。もちろん、DLLにコンパイルされた後、ソースコードの機密性もある程度改善されました。
この記事では、ASP.NETの基本的な処理プロセスと、ASP.NETでDLLマッピングを確立する方法、HTTPリクエスト/応答を処理できるDLLの開発方法、および設定方法を紹介します。 「トラップ」、CodeBehindのASPXファイルを備えた利用可能なASPXファイルをDLLプロセスにコンパイルします。記事の最後に、実際の操作プロセスのヒントも紹介されます。
この記事には、ASP.NETアプリケーション、コマンドラインコンパイル、web.config構成ファイルなどの概念が含まれているため、読者がこの記事の内容をよりよく理解し、この記事を蓄積しなくするようにすることができます。まず、この記事に対応するシステムは、この記事の紹介に対応しています。
システム環境:
Win2000(SP3) + IIS5 + .NETフレームワーク1.0(中国語版)。
サーバー名:
この記事の例はこのマシンでテストされているため、サーバー名はLocalHostです。
IIS設定:
仮想ディレクトリdlltest(実際のパスはw:/wwwroot/dlltestです)を確立し、dlltestの下にBinディレクトリを作成するためのアプリケーションとして設定します。すべてのソースファイルはdlltestディレクトリに配置され、すべてのDLLファイルはdlltest/binディレクトリに配置されます。
ASP.NETアプリケーション構成ファイル-WEB.CONFIG
dlltestディレクトリにweb.configファイルを作成します。ファイルのコンテンツは次のとおりです。
<?xmlバージョン= 1.0?>
<configuration>
<System.Web />
</configuration>
コマンドウィンドウ(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はASPXソースファイルよりも「古い」です。CSCコンパイラ(ASPXのサービスサイドスクリプトのASPXサービススクリプトがVBまたはJScriptの場合、対応するVBCコンパイラJSCコンパイラ)を呼び出してコンパイルしますASPXファイルはDLLになり、ASP.NETがDLLを呼び出して特定の顧客要求を処理し、サーバーの応答に戻ります。
一般に、この処理プロセスから見ることができます。それでは、「ルート」の処理をASPXファイルへのコンパイルされたDLLに強制する他の方法はありますか?この方法は、System.WebセクションのhttphandlersセクションにASP.NETアプリケーションのWEBセクションにDLLマッピングアイテムにASPXを追加することです。
<dd verb =* path = aspx file name type = class name、dll file/>
ASPXファイル:「ルーティング」の仮想名が必要であり、拡張機能はASPXでなければなりません。そうしないと、IISはASP.NETランニング環境で最初にファイルを処理します。
dllファイル:dllファイル(アプリケーションセット)名、「.dll」を入力する必要はありません。 ASP.NET最初に、アプリケーションのアプリケーションのアプリケーションのアプリケーションでアセンブリDLLを検索し、システムセットキャッシュキャッシュでアセンブリDLLを検索します。
クラス名:1つのDLLには複数の名前または複数のクラスがあるため、DLLが呼び出すときにクラスを自動的にロードする必要があります。
たとえば、特定のASP.NETアプリケーションのweb.configファイルは次のとおりです。
<?xmlバージョン= 1.0?>
<configuration>
<System.Web>
<httphandler>
<dd verb =* path = index.aspx type = bbs.indexpage、bbs />
</httphandler>
</ssystem.web>
</configuration>
構成ファイルは、ASP.NETに、クライアントがこのアプリケーションのindex.aspxファイルを要求したときに、アプリケーションbinディレクトリのbbs.dllを直接呼び出し、bbs.indexpageクラスを自動的にロードすることを伝えます。
2。開発はHTMLページのDLLを処理できます
すべてのアプリケーションDLLがHTTPリクエスト/応答モードを実装できるわけではないことを指摘する必要があります。 Microsoft ASP.NET高速エントリチュートリアル(http://chs.gotdotnet.com/quickstart/aspplus/)の「HTTP処理プログラムと工場」の説明を見てみましょう。
ASP.NETは低レベルの要求/応答APIを提供し、開発者が.NET Frameworkクラスを使用して、導入されたHTTPリクエストのサービスを提供できるようにします。この目的のために、開発者はSystem.web.ihttphandlerインターフェイスをサポートするクラスを作成し、ProcessRequest()メソッドを実装する必要があります。 HTTPリクエストを処理しても、高レベルのページフレームワークが提供するサービスを必要としない場合、処理プログラムは通常有用です。処理プログラムの一般的な用途には、CGIと同様のスクリーントとアプリケーション、特にバイナリデータを返すアプリケーションが含まれます。
ASP.NETが受信したHTTP要求からの各要求は、IHTTPHANDLERを実装するクラスの特定のインスタンスによって最終的に処理されます。 ihttphandlerfactoryは、ihttphandlerインスタンスURL要求の実際の分析を処理する構造を提供します。 ASP.NETが提供するデフォルトのIHTTPHANDLERFACTORYクラスに加えて、開発者は工場を作成および登録して、多数のリクエスト分析とアクティベーションソリューションをサポートすることもできます。
このテキストから、ASPXページが.NETフレームワーク(データキャッシュ、状態キーピング、Webウィンドウコントロール参照など)によって提供される高度なインターフェイステクノロジーが含まれない場合、特にバイナリデータを返す場合(写真、サウンドなど)クライアントには、.CSアプリケーションファイル(VBまたはJScriptを使用する場合はC#言語を使用して)を使用できます。 System.web.ihttphandlerインターフェイスとProcessRequest()メソッドを実装します。簡単な例は次のとおりです。
/*ソースファイル:ex1.cs開始*/
system.webを使用しています。
名前空間dlltenst
{{
/*
クラスは、ihttphandlerインターフェイスを実装する必要があります。プログラムがセッションステータスにアクセスする場合、iRequiressessionStateインターフェイスを実装する必要があります(メソッドを含まないマーカーインターフェイス)。
*/
パブリッククラスex1page:ihttphandler
{{
/*
IsReusable属性は、.NETフレームワークに、このプログラムが複数のスレッドで同時に使用できることを伝えます。
TRUEは対応するかどうか。
*/
パブリックブールIsReusable
{{
get {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にコンパイルし、Binディレクトリに保存します。
CSC /T:Library /oxin/ex1.dll ex1.cs
aspx-> dllマッピングを構成ファイルweb.configに追加します。
<?xmlバージョン= 1.0?>
<configuration>
<System.Web>
<httphandler>
<ded verb =* path = dlltest1.aspx type = dlltest.ex1page、ex1 />
</httphandler>
</ssystem.web>
</configuration>
これで、ブラウザがhttp://localhost/dlltest/dlltest1.aspxにアクセスすると、実際にはdlltest.ex1pageクラスのプロセスレスレクエストメソッドです。
第三に、単一のASPXファイルをDLLにコンパイルします
前のセクションで公開されている「Microsoft以外の意味」から判断すると、Microsoftは開発者をサポートしてASPXファイルをDLLに直接コンパイルすることをサポートしていません。ただし、ASP.NET Advanced Interfaceテクノロジー(サーバーHTMLコントロール、Webコントロールなど)は、ASPXファイルを介して表示する必要があります。 。 の。
今、落ち着いて分析します:
CSCコンパイラは、C#言語コンパイラのみです。ASPXファイルの形式は明らかにC#言語仕様に準拠していないため、CSCコンパイラはASPXをコンパイルできません。ソースファイル。
したがって、ASPXファイルをDLLファイルにコンパイルするには、ASPXファイルをCSCコンパイラが認識できるCSソースファイルに変換する必要があります。では、どのツールを変換に使用しますか?このツールは.NTフレームワークに隠されている必要があると考えていますが、情報の後に多数のASP.NETおよび.NETの公開マニュアルを確認しましたが、関連情報はまだ見つかりませんでした。
ああ、世界には方法がなく、偶然の機会が私にこの秘密を発見するようになります。
ソースファイルex2.aspxをご覧ください:
/*ソースファイル:ex2.aspx start*/
<%@ページ言語= C#%>
<スクリプトrunat = server>
/*
あなたはそれを正しく読みます、次の行は「abcdefg」です。
テキストでは、この行を「コードトラップ」と呼びます
*/
ABCDEFG //コードトラップ
void page_load(オブジェクトSRC、eventargs args)
{{
if(!ispostback)notlabel.text =名前を入力してください:;
}
void onnamesubmit(オブジェクトSRC、eventargs args)
{{
文字列名= f_name.value;
notlabel.text =(name ==)?いらっしゃいませ! ;;
}
</script>
<html>
<body>
<form runat = server>
<h1> dlltest -ex2(例2)</h1>
<hr>
<ASP:ラベルrunat = server id = notlabel style = color:red:bold />
<入力runat = server id = f_name size = 8>
<button runat = server onserverclick = onnamesubmit> ok </button>
</form>
</body>
</html>
/*ソースファイル:ex2.aspx end*/
「コードトラップ」がコメントまたは削除すると、Ex2.aspxは単純なASP.NETファイルを参照してください。
それでは、「トラップ」を開いて、ASP.NETが返したものを見てみましょう。
「コンパイルエラー」ページを返し、レポートソースファイルをコンパイルできません。興味深いのは、ページの下部にある「完全なコンピレーションソースを表示」と呼ばれるハイパーリンクです。 「完全なコンピレーションソース」のこの部分を削除し、以前の行番号情報と他のいくつかのコンピレーションスイッチ(主に#Lineコンパイルコマンド)を削除し、削除するかわいい「コードトラップ」を閉じ、終了後、EX2_ASPXとして保存します.CS:
/*ソースファイル:ex2_aspx.cs start*/
/*
以下の説明から、変換するASPXファイルをCSソースファイルに完成させるための途切れないツールが実際にあることがわかります
*/
// ----------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- ----------------------------------------------------------- -----------------------------------------------------
// <emutogenerate>
//このコードもAによって生成されました。
//ランタイムバージョン:1.0.3705.0
//
//このファイルへのchingesは、誤った動作を気にし、失われる可能性があります
//コードが再生されます。
// </autogenerate>
// ----------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- ----------------------------------------------------------- -----------------------------------------------------
/*
奇妙なことに:命名スペースは、実際にはASPXの代わりにASPです
この記事では、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.クラス名の構成に注意してください。たとえば、この記事では、Ex2Pageに変更できます。
2。基本クラスに注意してください。 System.web.ui.Pageは、セッションにアクセスしたいので、IRECRESSENSESTATEインターフェイスも実装しています。
*/
パブリッククラスex2_aspx:system.web.ui.page、system.web.sessionstate.irequiressenerationState {
Private static int __autohandler;
保護されたSystem.web.ui.webcontrols.label notelabel;
保護されたSystem.web.ui.htmlcontrols.htmlinputtext f_name;
保護されたSystem.web.ui.htmlControls.htmlbutton __control3;
保護されたSystem.web.ui.htmlcontrols.htmlform __control2;
private static bool __intialized = false;
Private Static System.Collections.ArrayList __ FileDependencies;
/*これで、「トラップ」をオフにすることができます*/
// abcdefg
void page_load(オブジェクトSRC、eventargs args)
{{
if(!ispostback)notlabel.text =名前を入力してください:;
}
void onnamesubmit(オブジェクト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 .__ filedependencies =依存関係;
asp.ex2_aspx .__ intialized = true;
}
}
保護されたオーバーライドint autohandler {
得る {
return asp.ex2_aspx .__ AutoHandler;
}
セット {
asp.ex2_aspx ._ autohandlers = value;
}
}
保護されたSystem.web.httpage applicationInstance {
得る {
return((system.web.httpapplication)(this.context.applicationInstance));
}
}
パブリックオーバーライド文字列テンプレートSourcedirectory {
得る {
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)
return __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;
return __ctrl;
}
private system.web.ui.control __buildcontrol__control3(){{)
System.web.ui.htmlControls.htmlbutton __ctrl;
__ctrl = new System.web.ui.htmlcontrols.htmlbutton();
この.__コントロール3 = __ctrl;
System.web.ui.iparseraccesser __parser =(system.web.ui.iparseracsess)(__ctrl));
__Parser.AddParsedSubObject(new System.Web.ui.LiteralControl(OK));
__ctrl.serverclick += new System.EventHandler(this.onnamesubmit);
return __ctrl;
}
private system.web.ui.control
System.web.ui.htmlControls.htmlform __ctrl;
__ctrl = new System.web.ui.htmlcontrols.htmlform();
この.__ control2 = __ctrl;
System.web.ui.iparseraccesser __parser =(system.web.ui.iparseracsess)(__ctrl));
__PARSER.ADDPARSEDSUBOBJECT(new System.Web.ui.LiteralControl(/r/n <h1> dlltest -ex2(例2)</h1>/r/n <hr>/r/n))
この.__ buildcontrolnotelabel();
__Parser.AddParsedSubObject(this.notelabel);
__Parser.AddParsedSubobject(new System.Web.ui.LiteralControl(/r/n));
この.__ buildcontrolf_name();
__PARSER.ADDPARSEDSUBOBJECT(this.f_name);
__Parser.AddParsedSubobject(new System.Web.ui.LiteralControl(/r/n));
この.__ buildcontrol__control3();
__PARSER.ADDDPARSEDSUBOBJECT(THIS .___ CONTROL3);
__Parser.AddParsedSubobject(new System.Web.ui.LiteralControl(/r/n));
return __ctrl;
}
private void __buildcontroltree(system.web.ui.control __ctrl){
System.web.ui.iparseraccesser __parser =(system.web.ui.iparseracsess)(__ctrl));
__PARSER.ADDDPARSEDSUBOBJECT(new System.Web.ui.LiteralControl(/r/n/r/n <html>/r/n <body>/r/n));
この.__ buildcontrol__control2();
__Parser.AdddParsedSubObject(this .___ control2);
__Parser.AdddParsedSubobject(new System.Web.ui.LiteralControl
}
保護されたオーバーライドvoid frameworkinitialize(){
この.__ buildcontroltree(this);
this.filedependencies = asp.ex2_aspx .__ filedependencies;
this.enableviewstatemac = true;
}
public Override int getTypeHashCode(){){)
return -11574299;
}
}
}
/*ソースファイル:ex2_aspx.cs end*/
このファイルを分析した後、ASP.NET操作の原則をさらに理解できると思います(この記事とは何の関係もない、不合理)。
コマンドライン状態では、次のコンパイルコマンドがex2_aspx.csをex2.dllにコンパイルし、Binディレクトリに保存します。
CSC /T:Library /oxin/ex2.dll ex2_aspx.cs
aspx-> dllマッピングを構成ファイルweb.configに追加します。つまり、システムのhttphandlersの次の行を追加します。
<derb =* path = dlltest2.aspx type = asp.ex2_aspx、ex2 />
ブラウザがhttp://localhost/dlltest/dlltest2.aspxにアクセスするとき、それはex2.aspxにアクセスするようなものです。もちろん、ex2.aspxが存在しない場合、または更新されていても、bin/ex2.dllが再生成されない限り、ページアクセスに影響を与えません。
第4に、CodeBehindのASPXファイルをDLLにコンパイルします
CodeBehindのASPXファイルをDLLにコンパイルすると、ASPXファイルをCSソースファイルに変換する原則は、上記と同じです。 CSソースファイルとして。違いは、dllにコンパイルされた場合の手順です:(インターフェイスファイルがex3.aspxであると仮定すると、codebehindファイルは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に追加します。つまり、system.webセクションのhttphandlersの次の行を追加します。
<add verb =* path = dlltest3.aspx type = asp.ex3_aspx、ex3 />
ブラウザを開き、http://localhost/dlltest/dlltest3.aspxにアクセスします。
5つ、ちょっとしたトリック
「トラップ」を設定してASPXファイルをCSソースファイルに変換する場合、通常、コピーアンドペーストメソッドを使用して、メモ帳またはvs.NETまたはその他のASP.NET開発環境の「完全なコンパイルソース」を保存し、次に保存します。 CSソースファイルの保存を完了した後。
整理は、ペーストの行番号情報と「#Line」コンピレーション命令を削除することです。この情報が手動で削除されている場合、Ex2.aspxなどの簡単なファイルでさえ、約270行の「完全なコンピレーションソース」が生成されます。
私が使用するトリックの1つは、ノートブックで、交換方法を使用して迅速に整理することです。 /*行を使用するには、すべての行を交換します。*/すべてを使用します:すべてを使用します// #line Lineを使用してすべての#lineを交換します。 、メインコンストラクター関数の設定を設定する「依存関係ファイル」の文は注釈が付けられているため、仕上げが完了していても。