ASP.NET 2.0不修改IIS 實(shí)現(xiàn)偽靜態(tài)網(wǎng)頁(yè)方法

[重要通告]如您遇疑難雜癥,本站支持知識(shí)付費(fèi)業(yè)務(wù),掃右邊二維碼加博主微信,可節(jié)省您寶貴時(shí)間哦!

方法一:利用Httphandler實(shí)現(xiàn)URL重寫(偽URL及偽靜態(tài))

我們有時(shí)候會(huì)見(jiàn)到這樣的地址:“http://www.5uhezu.com/show-12-34.html”,你或許認(rèn)為在站點(diǎn)服務(wù)器根目錄“/”下存在名為“show-12-34.html”的文件,其實(shí)實(shí)際它可能是不存在的,而可能你看到的內(nèi)容是“/aspx/show.aspx?type= 12&id=34”的內(nèi)容,為什么要這樣做呢?原因有多個(gè)方面:首先是增強(qiáng)URL的友好性,記“show-12-34.html”總比 “/aspx/show.aspx?type=12&id=34”好記吧?其次就是方便搜索引擎收錄,很多搜索引擎更看好靜態(tài)HTML頁(yè),比如:百度;其次就是出于安全性的考慮,因?yàn)檫@樣隱藏了參數(shù)“type”、“id”。是不是很有意思呢?

其實(shí)這是利用URL重寫實(shí)現(xiàn)的,下面我就說(shuō)一下在ASP.NET2.0下我所知道的最簡(jiǎn)單的實(shí)現(xiàn)方法:通過(guò)實(shí)現(xiàn)接口“IHttpHandler”來(lái)接管HTTP請(qǐng)求,F(xiàn)ollow me!

1.在資源管理方案中添加一個(gè)類,類的代碼如下:

//類URLRewriter程序清單:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
///

/// UrlRewriter URL重寫類
/// Author:yoyo
/// blog:http://gemin.com.cn
///

public class UrlRewriter : IHttpHandler //實(shí)現(xiàn)“IHttpHandler”接口
{
public UrlRewriter()
{
//
// TODO: 在此處添加構(gòu)造函數(shù)邏輯
//
}
public void ProcessRequest(HttpContext Context)
{
try
{
//取得原始URL屏蔽掉參數(shù)
string Url = Context.Request.RawUrl;
//建立正則表達(dá)式
System.Text.RegularExpressions.Regex Reg = new System.Text.RegularExpressions.Regex

(@"/show-(\d+)-(\d+)\..+",System.Text.RegularExpressions.RegexOptions.IgnoreCase);
//用正則表達(dá)式進(jìn)行匹配
System.Text.RegularExpressions.Match m =

Reg.Match(Url,Url.LastIndexOf("/"));//從最后一個(gè)“/”開(kāi)始匹配
if (m.Success)//匹配成功
{
String RealPath =

@"~/aspx/show.aspx?type=" + m.Groups[1] + "&id=" + m.Groups[2];
//Context.Response.Write(RealPath);
//Context.RewritePath(RealPath);//(RewritePath 用在無(wú) Cookie 會(huì)話狀態(tài)中。)
Context.Server.Execute(RealPath);
}
else

{
Context.Response.Redirect(Context.Request.Url.ToString());
}
}
catch
{
Context.Response.Redirect(Context.Request.Url.ToString());
}
}
///

/// 實(shí)現(xiàn)“IHttpHandler”接口所必須的成員
///

///
/// Author:yoyo
/// blog:http://gemin.com.cn
public bool IsReusable
{
get { return false; }
}
}

2.在web.config文件還要添加一下設(shè)置項(xiàng)

節(jié)點(diǎn)下添加如下代碼:



解釋一下:

verb是指允許的動(dòng)作“GET”、“POST”、“PUT”中的一種或幾種,星號(hào)“*”表示全部允許;

path是指匹配路徑,支持簡(jiǎn)單的通配符;

type是指綁定的類名以及包括命名空間(如果有的話);

對(duì)了,首先你要建立一個(gè)WEB窗體“show.aspx”在目錄“aspx”下,因?yàn)檫@個(gè)文件就是實(shí)際接受請(qǐng)求并顯示相關(guān)內(nèi)容的頁(yè)面。

OK!,編譯,打開(kāi)網(wǎng)站輸入地址http://localhost:80/show-12-34.aspx 訪問(wèn)一下,檢查看是不是顯示的“/aspx/show.aspx?type=12&id=34”的內(nèi)容呢?!

上面我是設(shè)置了匹配ASPX文件,因?yàn)镮IS里.HTML擴(kuò)展名默認(rèn)是不歸ASP.NET接管的,如果要接管HTML請(qǐng)求,
請(qǐng)將IIS的擴(kuò)展名.HTML映射到“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll”,
然后將上面的aspx改成html:



現(xiàn)在打開(kāi)網(wǎng)站輸入地址http://localhost:80/show-12-34.html 訪問(wèn)一下~!

方法二:地址重寫、使用偽靜態(tài)、頁(yè)面回發(fā)處理

制作網(wǎng)站頁(yè)面的時(shí)候,有時(shí)候?yàn)榱擞脩舻捏w驗(yàn)和搜索引擎的收錄,很多網(wǎng)站經(jīng)常使用偽靜態(tài)地址重寫,或者稱為 URL地址重寫的辦法,來(lái)將諸如:MyEbook.aspx?ID=1,MyEbook.aspx?ID=2MyEbook.aspx?ID=3等帶有參數(shù)的動(dòng)態(tài)頁(yè)面?zhèn)窝b成為一個(gè)靜態(tài)頁(yè)面,比如,將以上的偽裝成為My1.html,My2.html,My3.html等等諸如此類!

出發(fā)點(diǎn)是很好的,不僅有利于用戶體驗(yàn),也有利于收錄,實(shí)在是一舉兩得!

好處已講,現(xiàn)在來(lái)談?wù)勈褂眠@種辦法所存在的毛病,問(wèn)題就在于,當(dāng)你使用偽靜態(tài)技術(shù)的頁(yè)面有按鈕,需要提交內(nèi)容時(shí),這個(gè)時(shí)候,一旦與服務(wù)器之間有回發(fā)動(dòng)作,那么,地址欄里面顯示的網(wǎng)頁(yè)地址就不再是偽裝出來(lái)的My1.html,My2.html,My3.html等等拉,而是變?yōu)镸yEbook.aspx? ID=1,MyEbook.aspx?ID=2MyEbook.aspx?ID=3等等洛,如此一來(lái),會(huì)讓不太懂網(wǎng)頁(yè)制作的網(wǎng)友感到不安,他們會(huì)認(rèn)為自己在上一個(gè)騙子網(wǎng)站,認(rèn)為自己提交的數(shù)據(jù)都被另外一個(gè)網(wǎng)站給偷走了,總之,給他們的感覺(jué)就是,這樣的網(wǎng)站具有欺騙性質(zhì);很可能,以后他們?cè)僖膊桓疑夏愕木W(wǎng)站了?。?!………

下面本人就個(gè)人解決如上問(wèn)題的心得體會(huì)做如下說(shuō)明,希望能夠幫助廣大網(wǎng)友解決問(wèn)題!

解決如上問(wèn)題,有很多種辦法,有使用Javascript禁止回發(fā),有將頁(yè)面的

改為等等多種方法,反正能改的地方,都有人使用過(guò)了,并且,這樣的文章比較多,但是難以實(shí)現(xiàn),就本人脾氣而已,更喜歡直接了當(dāng)?shù)霓k法,盡量少改地方,免得日后出錯(cuò)麻煩;
第一步:打開(kāi)你的網(wǎng)站下面,新建一個(gè)類,文件名稱大體如此:MyActionlessform.cs

第二步:該類的代碼如下:

using System;
using System.IO;
using System.Web;
using System.Web.UI;
namespace MyURL
{
public class MyOLPage : Page
{
public MyOLPage()
{ }
protected override void Render(HtmlTextWriter writer)
{
if (writer is System.Web.UI.Html32TextWriter)
{
writer = new FormFixerHtml32TextWriter(writer.InnerWriter);
}
else
{
writer = new FormFixerHtmlTextWriter(writer.InnerWriter);
}
base.Render(writer);
}
}

internal class FormFixerHtml32TextWriter : System.Web.UI.Html32TextWriter
{
private string _url; // 偽裝的URL
internal FormFixerHtml32TextWriter(TextWriter writer)
: base(writer)
{
_url = HttpContext.Current.Request.RawUrl;
}
public override void WriteAttribute(string name, string value, bool encode)
{
if (_url != null && string.Compare(name, "action", true) == 0)
{
value = _url;
}
base.WriteAttribute(name, value, encode);
}
}
internal class FormFixerHtmlTextWriter : System.Web.UI.HtmlTextWriter
{
private string _url;
internal FormFixerHtmlTextWriter(TextWriter writer)
: base(writer)
{
_url = HttpContext.Current.Request.RawUrl;
}
public override void WriteAttribute(string name, string value, bool encode)
{
if (_url != null && string.Compare(name, "action", true) == 0)
{
value = _url;
}
base.WriteAttribute(name, value, encode);
}
}
}
之后,將這個(gè)類文件編譯成為MyActionlessform.dll文件,并在網(wǎng)站的項(xiàng)目中引用他,

第三步:打開(kāi)具有回發(fā)操作的頁(yè)面,將其中的:System.Web.UI.Page更改為: MyURL.MyOLPage,如此而已,一勞永逸了,以后不再擔(dān)心回發(fā)暴露真實(shí)地址嚇走網(wǎng)友拉!

至此,大功可成一半多一點(diǎn),接下來(lái)問(wèn)題又來(lái)了,什么問(wèn)題呢,你運(yùn)行一下你的網(wǎng)站,是不是出現(xiàn)如下錯(cuò)誤呀!

CS0433: 類型“MyURL.MyOLPage”同時(shí)存在于“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ Temporary ASP.NET Files\schoolit\3266aab1\aca2fc74\App_Code.2-69spm5.dll”和“c:\WINDOWS\ Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\schoolit\3266aab1\aca2fc74\assembly\dl3\4d107fc6\00b753fe_ea19c801\ MyActionlessform.DLL”中

大體就是這樣的錯(cuò)誤了,針對(duì)這樣的錯(cuò)誤,有很多解決辦法,有的地方說(shuō),刪除臨時(shí)使用的文件夾,刪除某個(gè)命名空間等等操作,俺都試過(guò)了,但是百試不得其果,后來(lái)俺就自己想想,出現(xiàn)這樣的錯(cuò)誤無(wú)非就是兩個(gè)文件同時(shí)存在,但是又不能重復(fù)使用,解決辦法那還不簡(jiǎn)單,停用一個(gè),只使用一個(gè)就行了嘛

上面的,我們不是建立了一個(gè)MyActionlessform.cs了嗎,它存在App_Code這個(gè)文件夾里面,另外一個(gè)是 MyActionlessform.dll,兩個(gè)文件內(nèi)容完全一樣,做好了,我們就不需要MyActionlessform.cs了,我們只需要 MyActionlessform.dll,那么,想方設(shè)法將前者弄走不就得了(本人建議將此文件排除項(xiàng)目,不提倡直接刪除該文件,因?yàn)橐院罂赡苁褂玫剑救俗龇ㄊ?,在?xiàng)目中直接排出MyActionlessform.cs文件,經(jīng)過(guò)測(cè)試,大功至此已結(jié)束?。。。?/p>

方法三:利用Mircosoft URLRewriter.dll實(shí)現(xiàn)頁(yè)面?zhèn)戊o態(tài)
昨天,轉(zhuǎn)貼了一篇利用ISAPI篩選器來(lái)實(shí)現(xiàn)URL偽靜態(tài)的文章,我按照文章上的內(nèi)容做,可是沒(méi)有做出來(lái),目前看來(lái),該方法沒(méi)有使用Microsoft URLRewriter.dll這個(gè)方法好,至少我個(gè)人覺(jué)得,花了一個(gè)晚上的時(shí)間,終于研究出來(lái)了怎么利用這個(gè)dll文件來(lái)對(duì)asp.net頁(yè)面實(shí)現(xiàn)靜態(tài)化了,其實(shí)很簡(jiǎn)單。
一,獲得Mircosoft URLRewriter.dll:
獲得Mircosoft URLRewriter.dll可以到http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx?mfr=true
這里,選擇[下載本文的源代碼],下載完畢后,導(dǎo)入工程,我這里沒(méi)有對(duì)該工程做任何修改,保留了原來(lái)的重寫方式,然后直接在VS2005里面生成.dll文件就可以了。
二,使用該dll文件:
添加引用,搞定。
三,頁(yè)面方面的設(shè)計(jì),這里不在贅述了,我會(huì)放一個(gè)下載包,有興趣的朋友下載來(lái)看看吧,代碼寫的比較亂。
四,web.config的配置
這部是非常關(guān)鍵的,也是靜態(tài)化能否成功的關(guān)鍵。





~/web/new/type/(.[0-9]*)\.html
~/web/new.aspx?id=$1


~/web/index.html
~/web/index.aspx









這里簡(jiǎn)單介紹一下:



要查找的模式
要用來(lái)替換模式的字符串


要查找的模式
要用來(lái)替換模式的字符串



httpHandlers的設(shè)置主要是配合IIS將請(qǐng)求重新定義處理,這里也比較關(guān)鍵,如果不存在合理的httpHandlers,那么,訪問(wèn)肯定會(huì)失敗的。

關(guān)于正則表達(dá)式,可以到百度里搜索:"常用正則表達(dá)式",會(huì)有很多。

五.配置IIS解析.html文件
右鍵點(diǎn)我的電腦-->管理-->展開(kāi)'服務(wù)和應(yīng)用程序'-->internet信息服務(wù)-->找到你共享的目錄-->右鍵點(diǎn)擊屬性 -->點(diǎn)擊'配置'-->映射下面 -->找到.aspx的可執(zhí)行文件路徑復(fù)制路徑-->粘貼路徑-->擴(kuò)展名為".html"-->然后把檢查文件是否存在的勾去掉這樣就可以了,如果遇到“確定”按鈕失效,可以用鍵盤事件編輯路徑即可解決。

問(wèn)題未解決?付費(fèi)解決問(wèn)題加Q或微信 2589053300 (即Q號(hào)又微信號(hào))右上方掃一掃可加博主微信

所寫所說(shuō),是心之所感,思之所悟,行之所得;文當(dāng)無(wú)敷衍,落筆求簡(jiǎn)潔。 以所舍,求所獲;有所依,方所成!

支付寶贊助
微信贊助

免責(zé)聲明,若由于商用引起版權(quán)糾紛,一切責(zé)任均由使用者承擔(dān)。

您必須遵守我們的協(xié)議,如您下載該資源,行為將被視為對(duì)《免責(zé)聲明》全部?jī)?nèi)容的認(rèn)可->聯(lián)系老梁投訴資源
LaoLiang.Net部分資源來(lái)自互聯(lián)網(wǎng)收集,僅供用于學(xué)習(xí)和交流,請(qǐng)勿用于商業(yè)用途。如有侵權(quán)、不妥之處,請(qǐng)聯(lián)系站長(zhǎng)并出示版權(quán)證明以便刪除。 敬請(qǐng)諒解! 侵權(quán)刪帖/違法舉報(bào)/投稿等事物聯(lián)系郵箱:service@laoliang.net
意在交流學(xué)習(xí),歡迎贊賞評(píng)論,如有謬誤,請(qǐng)聯(lián)系指正;轉(zhuǎn)載請(qǐng)注明出處: » ASP.NET 2.0不修改IIS 實(shí)現(xiàn)偽靜態(tài)網(wǎng)頁(yè)方法

1 評(píng)論

  1. 又發(fā)現(xiàn)一個(gè)白癡,標(biāo)題說(shuō)不需修改IIS實(shí)現(xiàn),最后第五條還是修改了IIS。真是白癡。

發(fā)表回復(fù)

本站承接,網(wǎng)站推廣(SEM,SEO);軟件安裝與調(diào)試;服務(wù)器或網(wǎng)絡(luò)推薦及配置;APP開(kāi)發(fā)與維護(hù);網(wǎng)站開(kāi)發(fā)修改及維護(hù); 各財(cái)務(wù)軟件安裝調(diào)試及注冊(cè)服務(wù)(金蝶,用友,管家婆,速達(dá),星宇等);同時(shí)也有客戶管理系統(tǒng),人力資源,超市POS,醫(yī)藥管理等;

立即查看 了解詳情