国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

完成自己的ASP.NET宿主系統

完成自己的ASP.NET宿主系統

更新時間:2022-05-14 文章作者:未知 信息來源:網絡 閱讀次數:

實現自己的ASP.NET宿主系統

楊山河

一、 宿主概念
托管是.NET的一個很基礎的概念,所有的.NET應用程序代碼要完全發揮作用需要進入托管的環境(CLR --Common Language Runtime),而這個環境實際上就是稱作宿主(Host)為將要啟動的.NET代碼準備的。目前來講windows系統上,能夠擔負這個重任的有3類已存程序:
1、 shell(通常是Explorer),提供從用戶桌面啟動.NET程序,創建一個進程,啟動此進程建立CLR
2、 瀏覽器宿主(Internet Explorer),處理從web下載的.NET代碼執行。
3、 服務器宿主(如IIS的輔助進程ASPnet_wp.exe)
通常來講,我們開發的ASP.NET的程序運行在IIS的環境下(實際上由一個ISAPI控制啟動CLR),但實際上ASP.NET程序可以擺脫IIS單獨在任何托管環境下運行。本文討論了ASP.NET程序如何在自定義的環境中啟動,希望有助于我們了解ASP.NET的執行原理,同時使我們開發的ASP.NET能夠在任何.NET環境下執行,不管是服務器操作系統還是普通的桌面操作系統。

二、 IIS宿主中ASP.NET的執行分析
關于IIS中ASP.NET的執行細節,很多文章做了詳盡權威的分析,本文不打算贅述,在此給出一些參考:
http://www.yesky.com/SoftChannel/72342380468043776/20030924/1731387.shtml
http://chs.gotdotnet.com/quickstart/ASPplus/doc/procmodel.ASPx
這些文章大致重點分析了:宿主環將如何啟動、ASP.NET應用程序如何產生程序集、如何加載,同宿主的交互等細節。

三、 構造自己的ASP.NET宿主程序
ASP.NET是作為微軟ASP的替代技術出現的,所以我們重點討論如何通過web方式應用ASP.NET(顯然還有其他方式),具體就是:我們用.NET平臺的語言編寫一個控制臺程序,這個程序啟動一個ASP.NET應用環境,執行關于ASPx的請求。具體來講,需要做以下工作:
1、實現一個Web Server,監聽所有的web請求,實現Http web hosting
2、啟動一個應用程序域,創建一個ASP.NET的ApplicationHost,建立一個ASP.NET的應用程序域,另外還建立一個HttpWorkerRequest的具體實現類,該類可以處理ASPx請求,編譯ASPx頁,編譯后的托管代碼緩存入當前應用程序域,然后執行代碼,得到執行結果。建議在繼續閱讀下文前,仔細翻查MSDN中的關于這兩個類得參考說明。
System.Web.Hosting.ApplicationHost類用于建立一個獨立的應用程序域。當然不是普通的應用程序域,而是為ASP.NET建立執行環境,準備需要的空間、數據結構等。僅有一個靜態方法static object CreateApplicationHost(
Type host //具體的用戶實現類,就是ASP.NET應用域需要加載的類
string virtualDir, //此應用域在整個web中的執行目錄,虛擬目錄
string physicalDir //對應的物理目錄
);
而其中的host 參數指向一個具體的類,由于該類實際上屬于兩個應用域之間的聯系類,在兩個應用程序域之間編組傳遞數據,所以必須要繼承自MarshalByRefObject,以允許在支持應用程序中跨應用程序域邊界訪問(至于為什么,建議翻查參考3)。
可以看到,我們需要啟動兩個應用程序域(web server功能應用程序域和ASP.NET 應用程序域),而這兩個(應用程序)域之間通過跨(應用程序)域的流對象引用來實現,使得在ASP.NET域中執行的結果可以通過web server域返回給請求者。
可以大致下圖表達
執行ASP.NET的Web服務器端










WEB客戶端

代碼實現分析:
using System;
using System.Web ;
using System.Web.Hosting;
using System.IO;
using System.NET;
using System.NET.Sockets ;
using System.Text ;
using System.Threading ;

namespace MyIIS
{
class ASPHostServer
{
[STAThread]
static void Main(string[] args)
{
//創建并啟動服務器
MyServer myserver=new MyServer(“/”, ”c:\\inetpub\\wwwroot\\myWeb”);
}
}

class MyServer //處理HTTP協議的服務器類
{
private ASPDOTNETHost ASPnetHost; //ASP.NET host的實例
private TcpListener mytcp; //Web監聽套接字
bool bSvcRunning=true; //服務是否運行指示
FileStream fs; //處理http請求的普通文本要求

public MyServer(string virtualDir ,vstring realPath)
{//在構造函數中啟動web監聽服務
try
{
mytcp=new TcpListener(8001);
mytcp.Start(); //啟動在8001端口的監聽
Console.WriteLine("服務啟動...");
//利用CreateApplicationHost方法建立一個獨立的應用程序域執行ASP.NET程序
ASPnetHost = ( ASPDOTNETHost )ApplicationHost.CreateApplicationHost
( typeof( ASPDOTNETHost ) , virtualDir , realPath);
Thread t=new Thread(new ThreadStart(MainSvcThread));
t.Start(); //服務線程啟動 負責處理每一個客戶端的請求
}
catch(NullReferenceException)
{
Console.WriteLine("NullReferenceException throwed!") ;
}
}

public void MainSvcThread() //ASP.NET Host的web服務器的主要服務線程
{
int s=0;
string strRequest; //請求信息
string strDir; //請求的目錄
string strRequestFile; //請求的文件名
string strErr=""; //錯誤信息
string strRealDir; //實際目錄
string strWebRoot=rpath; //應用根目錄
string strRealFile=""; //正在請求的文件的磁盤路徑
string strResponse=""; //回應響應緩沖區
string strMsg=""; //格式化響應信息
byte[] bs; //輸出字節緩沖區

while(bSvcRunning)
{
Socket sck=mytcp.AcceptSocket(); //每個請求到來
if(sck.Connected)
{
Console.WriteLine("Client {0} connected!",sck.RemoteEndPoint);
byte[] bRecv=new byte[1024]; //緩沖區
int l=sck.Receive(bRecv,bRecv.Length,0);
string strBuf=Encoding.Default.GetString(bRecv); //轉換成字符串,便于分析
s=strBuf.IndexOf("HTTP",1);
string httpver=strBuf.Substring(s,8); // HTTP/1.1 之類的
strRequest=strBuf.Substring(0,s-1);
strRequest.Replace("\\","/");
if((strRequest.IndexOf(".")<1) && (!strRequest.EndsWith("/")))
{
strRequest += "/";
}
s=strRequest.LastIndexOf("/")+1;
strRequestFile = strRequest.Substring(s); strDir=strRequest.Substring(strRequest.IndexOf("/"),strRequest.LastIndexOf("/")-3); //取得訪問的URL
if(strDir=="/")
{
strRealDir=strWebRoot;
}
else
{
strDir=strDir.Replace("/","\\");
strRealDir=strWebRoot + strDir;
}
Console.WriteLine("Client request dir: {0}" , strRealDir);
if(strRequestFile.Length==0)
{
strRequestFile="default.htm"; //缺省文檔
}
int iTotlaBytes=0; //總計需要輸出的字節
strResponse=""; //輸出內容
strRealFile = strRealDir +"\\"+ strRequestFile;
if(strRealFile.EndsWith(".ASPx")) //這里有Bug!!
{
string output="";
//注意我下面的語句們給host對象ProcessRequest方法傳遞了一個ref類型的參數,
//ASPnetHost會從ASP.NET的執行應用程序域執行一個請求后返回流給當前web server所在的域,這實際上發生了一個域間的調用
ASPnetHost.ProcessRequest (strRequestFile, ref output);//轉換成字節流
bs=System.Text.Encoding.Default.GetBytes (output);
iTotlaBytes=bs.Length ; //調用套接字將執行結果返回
WriteHeader(httpver,"text/html",iTotlaBytes,"200 OK",ref sck);
FlushBuf(bs,ref sck);
}
else
{try
{
fs=new FileStream( strRealFile,FileMode.Open,FileAccess.Read,FileShare.Read );
BinaryReader reader=new BinaryReader(fs); //讀取
bs=new byte[fs.Length ];
int rb;
while((rb=reader.Read(bs,0,bs.Length ))!=0)
{
strResponse =strResponse +Encoding.Default.GetString(bs,0,rb);
iTotlaBytes =iTotlaBytes+rb;
}
reader.Close();
fs.Close();
WriteHeader(httpver,"text/html",iTotlaBytes,"200 OK",ref sck);
FlushBuf(bs,ref sck);
}
catch(System.IO.FileNotFoundException )
{//假設找不到文件,報告404 WriteHeader(httpver,"text/html",iTotlaBytes,"404 OK",ref sck);
}
}
}
sck.Close(); //Http請求結束
}
}

// WriteHeader想客戶端發送HTTP頭
public void WriteHeader(string ver,string mime,int len,string statucode,ref Socket sck) {
string buf="";

if(mime.Length ==0)
{
mime="text/html";

buf=buf+ver+ statucode + "\r\n";
buf=buf+"Server:MyIIS"+"\r\n";
buf=buf+"Content-Type:"+mime +"\r\n";
buf=buf+"Accept-Rabges:bytes"+"\r\n";
buf=buf+"Content-Length:"+ len +"\r\n\r\n";
byte[] bs=Encoding.Default.GetBytes(buf);
FlushBuf(bs,ref sck);
}
}

// FlushBuf刷新向客戶發送信息緩沖區
public void FlushBuf(byte[] bs,ref Socket sck)
{
int iNum=0;
try
{
if(sck.Connected)
{
if((iNum=sck.Send(bs,bs.Length ,0))==-1)
{
Console.WriteLine("Flush Err:Send Data err");
}
else
{
Console.WriteLine("Send bytes :{0}",iNum);
}
}
else
{
Console.WriteLine("Client diconnectioned!");
}
}
catch(Exception e)
{
Console.WriteLine("Error:{0}",e);
}
}
}

// ASPDOTNETHost類實例需要跨越兩個應用程序域,所以繼承自MarshalByRefObject
class ASPDOTNETHost:MarshalByRefObject
{
public void ProcessRequest( string fileName ,ref string output)
{
MemoryStream ms=new MemoryStream(); //內存流,當然為了速度
StreamWriter sw = new StreamWriter(ms); //輸出
sw.AutoFlush = true; //設為自動刷新 /先構造一個HttpWorkRequest請求類,以便ASP.NET能夠分析獲取請求信息,同時傳入一個輸出流對象供ASP.NET執行期間返回html流
HttpWorkerRequest worker = new SimpleWorkerRequest( fileName, "" ,sw) ; // 調度某個頁,這里面的包含很多細節,后面分析
HttpRuntime.ProcessRequest( worker ) ;
StreamReader sr= new StreamReader(ms); //準備從內存流中讀取
ms.Position =0; //移動指針到頭
output = sr.ReadToEnd();
}
}
}
HttpRuntime.ProcessRequest( worker ) ;包括了那些細節呢?大體上如下:
1、首先,worker對象傳入給ASP.NET的應用程序域,告知發生了對于哪一個ASPx文件的請求,以及當前目錄是什么,如果在執行期間發生的輸出內容應該寫到哪里(sw對象)。這發生一個由web server當前應用程序域到我們自己建立的ASP.NET應用程序域的跨(應用程序)域調用,還可能由于是第一次訪問,會發生了全局事件、或者session事件等。
2、ASP.NET的應用程序域會檢測請求的ASPx文件是否存在,不存在,就報錯;如果存在還要看看代碼緩存中是否存在上次編譯的代碼,如果存在且ASP.NET檢測到不需要重新編譯,會直接執行緩存中的代碼;如果不存在或者代碼過期需要重新編譯,就需要讀取ASPx文件,編譯成.NET的代碼,存入緩存。可能有些頁存在代碼和模板分離成多個文件,甚至包括一些資源文件,這些都需要讀取后編譯成.NET的虛擬機代碼,然后在托管環境里執行。
3、執行ASP.NET的編譯代碼緩存中的代碼,輸出數據利用sw對象輸出。
當然,根據不同的配置,還有很多方法的調用/事件的發生等細節不同。
如何調試運行以上程序,觀察結果呢?
建立一個控制臺類型工程,將上述代碼錄入后編譯,將得到的程序拷貝在作為站點應用起始目錄(譬如c:\inetpub\wwwroot\myweb)的bin子目錄下,然后啟動,這樣在其中創建ASP.NET應用程序域才不會因為程序集加載失敗而出錯。建立一個asp.net工程在目錄下,添加default.htm文件和測試用的test.aspx,加入.NET執行代碼,然后啟動IE,在地址欄分別輸入:http://127.0.0.1:8001/default.htm http://127.0.0.1:8001/test.aspx感受一下執行過程。甚至你可以建立的工程中設定斷點之類,仔細調試和觀察其中的細節。親手試一試吧,一定有收獲的!

四、 自己構造ASP.NET宿主的意義
費了半天勁搞自己的ASP.NET宿主,對于我們有何意義呢?
首先,是大致從代碼級清楚分析ASP.NET執行細節,自己學習了解執行細節,除了可以在出現ASP.NET故障可以進行精確定位和排除外,還可以幫助我們在寫ASP.NET應用程序時寫出更有效率和健壯的代碼。
其次,我們可以提供一個思路,可以將我們的ASP.NET程序運行于低配置機器上,脫離IIS。ASP.NET的“原配”宿主IIS需要運行在Server OS上,要知道在安全專家眼中,IIS可是大隱患的源頭之一。我們可以將很多傳統程序利用ASP.NET編寫,但脫離IIS獨立執行,譬如在win98系統上執行ASP.NET。web server和ASP.NET都在托管環境中執行,相比較ISAPI建立宿主然后執行,除提高效率外,還可以使用.NET平臺提供的豐富管理調控功能,寫B/S程序更接近傳統程序編寫方式,這對于程序員來講都是效率(編寫代碼的效率和執行效果效率)的保證。
另外,對于采用ASP.NET做的項目,大家可以很方便進行開發調試、運行維護、安裝。即使是普通桌面程序,我們也可以通過類似制作網頁的方式編寫這些界面和代碼,然后獨立建立類似本例中的Host環境,根據用戶交互請求加載執行某些頁面,然后將界面在客戶端通過相關組件顯示出來。你可以通過此獲得ASP.NET的即時編譯功能和ASP.NET宿主托管環境,大量可自由使用的API,便于開發、安裝、維護。畢竟,托管環境幾乎準備了您需要的一切功能。

五、 參考資料
1、.NET MSDN
2、清華大學出版社《.NET網絡高級編程》Andrew Krowczyk Viond Kumar原著
3、清華大學出版社《.NET框架程序設計(修訂版)》Jsfftry Richter著

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        99在线热播精品免费| av中文字幕亚洲| 成人激情校园春色| 国产亚洲精品bt天堂精选| 国产成人亚洲综合a∨婷婷| 久久女同精品一区二区| 国产成人av电影在线| 国产精品国产三级国产aⅴ入口 | 亚洲成人av福利| 91精品国产乱| 成人免费高清在线| 亚洲午夜激情网站| 久久久久久久久久美女| 91成人网在线| 久久99精品视频| 亚洲欧美激情视频在线观看一区二区三区 | 91精品国产综合久久婷婷香蕉| 免费成人av在线| 国产精品免费av| 91麻豆精品国产91久久久久久| 国模套图日韩精品一区二区| 最新中文字幕一区二区三区| 欧美日韩在线观看一区二区 | 成人福利视频在线看| 亚洲午夜久久久久久久久电影网| 久久影院视频免费| 欧美亚洲综合色| 国产成人免费av在线| 亚洲国产一区二区视频| 欧美国产禁国产网站cc| 精品免费国产二区三区| 欧美性大战xxxxx久久久| 国产激情精品久久久第一区二区 | 在线播放中文一区| 国产精品夜夜嗨| 日韩va欧美va亚洲va久久| 综合精品久久久| 久久九九久精品国产免费直播| 欧美日韩中字一区| 91蜜桃视频在线| youjizz国产精品| 国产精品一区二区在线看| 奇米一区二区三区| 午夜久久福利影院| 亚洲最快最全在线视频| 中文字幕一区二区视频| 国产精品免费av| 国产精品色一区二区三区| 国产亚洲欧美日韩日本| 久久久另类综合| 久久久久久一二三区| 日韩免费一区二区三区在线播放| 91麻豆精品国产91久久久使用方法| 91丝袜国产在线播放| 不卡高清视频专区| 99视频精品免费视频| k8久久久一区二区三区 | 免费成人在线观看| 日韩av一区二| 日韩精彩视频在线观看| 午夜欧美大尺度福利影院在线看| 亚洲一区免费视频| 亚洲123区在线观看| 日本va欧美va瓶| 韩国女主播成人在线| 国产激情视频一区二区三区欧美| 国产精品乡下勾搭老头1| 成人午夜电影久久影院| 91丨porny丨中文| 欧美中文字幕一二三区视频| 欧美日韩精品一区二区三区四区| 欧美精品粉嫩高潮一区二区| 日韩欧美另类在线| 欧美国产日韩亚洲一区| 夜夜嗨av一区二区三区中文字幕| 全国精品久久少妇| 国产成人三级在线观看| 99久久久无码国产精品| 欧美三电影在线| 久久嫩草精品久久久精品一| 国产欧美一区二区精品忘忧草| 亚洲欧美区自拍先锋| 全国精品久久少妇| 成人av手机在线观看| 欧美日韩精品一二三区| 欧美mv和日韩mv的网站| 亚洲日本护士毛茸茸| 久久精品国产亚洲a| 91日韩在线专区| 精品国产伦一区二区三区免费| 国产精品美女久久久久aⅴ| 午夜激情综合网| 播五月开心婷婷综合| 欧美一级在线免费| 亚洲天堂福利av| 国产原创一区二区三区| 在线视频一区二区三区| 国产亚洲精品bt天堂精选| 亚洲成人自拍一区| 国产成人午夜精品5599| 欧美高清hd18日本| 国产精品国产三级国产aⅴ无密码| 亚洲成人一二三| 国产成人亚洲综合色影视| 欧美久久一二区| 亚洲美女少妇撒尿| 国产一区二区视频在线播放| 欧美日韩的一区二区| 中文字幕一区二区三区在线播放 | 97精品电影院| 久久综合色综合88| 日韩激情一区二区| 在线亚洲欧美专区二区| 欧美极品美女视频| 激情图片小说一区| 在线播放国产精品二区一二区四区| 国产精品久久久久久久岛一牛影视 | 51精品久久久久久久蜜臀| 中文字幕亚洲欧美在线不卡| 国产精品一区二区91| 欧美电影免费观看高清完整版 | 欧洲精品在线观看| 亚洲柠檬福利资源导航| 不卡视频一二三| 国产精品久久久久久久浪潮网站| 国产91精品露脸国语对白| 日本一区二区免费在线| 国产成都精品91一区二区三 | 欧美日韩成人在线| 亚洲一区二区高清| 91网页版在线| **性色生活片久久毛片| 成人av午夜影院| 国产精品美女久久久久aⅴ| 欧美日韩国产天堂| 有坂深雪av一区二区精品| 91在线播放网址| 成人欧美一区二区三区| 不卡的看片网站| 欧美性淫爽ww久久久久无| 亚洲最大的成人av| 在线观看视频一区二区 | 国产精品灌醉下药二区| 91麻豆福利精品推荐| 亚洲男人的天堂一区二区| 91网上在线视频| 亚洲宅男天堂在线观看无病毒| 91精品1区2区| 天天综合色天天综合| 日韩你懂的在线播放| 国产精品一区在线| 国产精品久久精品日日| 91国产成人在线| 日韩成人精品在线观看| 精品电影一区二区三区| 99国产精品久久久久久久久久| 亚洲欧美aⅴ...| 欧美日本免费一区二区三区| 免费人成网站在线观看欧美高清| 日韩欧美一区二区视频| 国产乱码精品一区二区三区忘忧草| 欧美国产成人在线| 欧美图区在线视频| 精品一区二区三区在线观看 | 欧美精品国产精品| 久久国产福利国产秒拍| 最新高清无码专区| 欧美大片日本大片免费观看| 91理论电影在线观看| 精品一区二区三区在线观看| 中文字幕一区三区| 精品国产一区二区亚洲人成毛片| 91免费版在线| 国产精品夜夜嗨| 日韩国产精品91| 一区二区三区在线观看动漫| 久久久亚洲高清| 欧美一区永久视频免费观看| 91尤物视频在线观看| 国产精品一区二区无线| 日韩va亚洲va欧美va久久| 亚洲激情中文1区| 国产日韩v精品一区二区| 69av一区二区三区| 欧美性受xxxx| 91小视频免费看| 成人小视频在线| 国产一区二区三区在线看麻豆| 图片区日韩欧美亚洲| 亚洲欧美福利一区二区| 国产精品色一区二区三区| 久久久www成人免费无遮挡大片| 欧美人与性动xxxx| 欧美性猛片xxxx免费看久爱| 99国产一区二区三精品乱码| 成人看片黄a免费看在线| 国产成a人无v码亚洲福利| 久久精品国产网站| 九一九一国产精品| 久久精品国产一区二区三|