校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識(shí)庫 > URL重寫及干掉ASP.NET試圖狀態(tài)的實(shí)現(xiàn)方法

URL重寫及干掉ASP.NET試圖狀態(tài)的實(shí)現(xiàn)方法

熱門標(biāo)簽:400電話個(gè)人能不能辦理 上海400客服電話怎么申請(qǐng) 手機(jī)外呼系統(tǒng)什么原理 滄州電銷外呼系統(tǒng)價(jià)格 溫州外呼系統(tǒng)招商 合肥ai電銷機(jī)器人費(fèi)用 凱立德地鐵站地圖標(biāo)注 銀行信貸電話機(jī)器人 天津電銷外呼系統(tǒng)違法嗎
1、URL重寫已經(jīng)很普遍了,但基本上大部分的URL重寫都不支持頁面的相對(duì)路徑,所有如果想在已經(jīng)開發(fā)好的項(xiàng)目中添加還是有壓力的,第二就是例如微軟的那個(gè)URL重寫是根據(jù)正則表達(dá)式來處理的,那樣是很好,但也有不足之處,就是不方便定位到某個(gè)頁面只能有哪些參數(shù)。
我覺得要解決的問題有一下幾個(gè):
1、解決如圖片js等不能使用相對(duì)路徑的文件
2、解決某個(gè)頁面能有幾個(gè)參數(shù)和哪些參數(shù)是可選的
下面就是解決掉這些問題了
  添加處理程序MyHttpModule,下面是我的一個(gè)簡單的處理程序(我只是做了一個(gè)簡單的,并沒有考慮性能,而且我是寫死的一個(gè)url重寫就是重寫成沒有擴(kuò)展名的)
復(fù)制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Web;
using System.IO;
using System.Text;
namespace MyClass
{
public class MyHttpModule : IHttpModule
{
#region IHttpModule 成員
///summary>
/// 釋放所有資源
////summary>
public void Dispose()
{
}
///summary>
/// 初始化模塊,并使其為處理請(qǐng)求做好準(zhǔn)備
////summary>
///param name="context"> 一個(gè) System.Web.HttpApplication,它提供對(duì) ASP.NET 應(yīng)用程序內(nèi)所有應(yīng)用程序?qū)ο蟮墓玫姆椒?、屬性和事件的訪問/param>
public void Init(HttpApplication context)
{
context.AuthorizeRequest += new
EventHandler(this.BaseModuleRewriter_AuthorizeRequest);
}
///summary>
/// 當(dāng)安全模塊已驗(yàn)證用戶授權(quán)時(shí)發(fā)生
////summary>
///param name="sender">/param>
///param name="e">/param>
protected virtual void BaseModuleRewriter_AuthorizeRequest(
object sender, EventArgs e)
{
System.Web.HttpApplication app = (System.Web.HttpApplication)sender;
Rewrite(app.Request.Path, app);
}
///summary>
/// 重寫url
////summary>
///param name="requestedPath">url的虛擬路徑/param>
///param name="app">/param>
protected void Rewrite(string requestedPath, System.Web.HttpApplication app)
{
Liststring> qeryString;
string virtualPath;
string inputFile = GetInputFile(app.Context, out virtualPath, out qeryString);//獲取到真實(shí)的文件信息
if (System.IO.Path.GetExtension(inputFile) == ".aspx")//如果是aspx文件 那么則把保留重寫的url
{
app.Context.RewritePath(requestedPath, string.Empty, string.Empty);//這里查詢參數(shù)我沒去處理了,也就是Request.QueryString的信息,如果取qeryString 然后去處理成一個(gè)字符串
return;
}
app.Context.RewritePath(virtualPath, string.Empty, app.Context.Request.QueryString.ToString());//其它文件則使用找到的路徑
}
///summary>
/// 獲取url對(duì)應(yīng)的絕對(duì)路徑和虛擬路徑及查詢參數(shù)
////summary>
///param name="context">/param>
///param name="virtualPath">虛擬路徑/param>
///param name="qeryString">查詢參數(shù) 如果為null請(qǐng)取HttpContext.Request.QueryString/param>
///returns>url對(duì)應(yīng)的絕對(duì)路徑/returns>
public static string GetInputFile(HttpContext context, out string virtualPath, out Liststring> qeryString)
{
string executionFilePath = context.Request.AppRelativeCurrentExecutionFilePath.Remove(0, 2);//獲取當(dāng)前對(duì)應(yīng)的虛擬路徑并干掉“~/”
string inputFile = context.Request.PhysicalPath;//獲取當(dāng)前url對(duì)于的絕對(duì)路徑
virtualPath = context.Request.AppRelativeCurrentExecutionFilePath;
qeryString = null;
Liststring> qeryList = new Liststring>();
if (!File.Exists(inputFile))//判斷文件是否存在,也就是沒有被重寫的url獲取使用絕對(duì)路徑的資源等等
{
bool b = false;
string fileName;
string extension;
string applicationPath = context.Request.PhysicalApplicationPath;//獲取網(wǎng)站的跟目錄
var tempPath = GetFileInfo(inputFile, out fileName, out extension);
while (!b)//根據(jù)目錄循環(huán)獲取有效的文件目錄
{
b = File.Exists(tempPath + "\\" + extension);//判斷文件是否存在
if (tempPath + "\\" == applicationPath)//如果查找到根目錄還沒有查找到那么則不需要在查了
{
break;
}
if (!string.IsNullOrWhiteSpace(fileName))
{
qeryList.Add(fileName);//如果不存在那么這個(gè)就是參數(shù) 例如http://localhost:4688/WebForm1/2011/ (對(duì)應(yīng)http://localhost:4688/WebForm1.aspx?xxx=2011)
}
tempPath = GetFileInfo(tempPath, out fileName, out extension);
}
if (b)//如果查找到了就把查找到的路徑復(fù)制給輸出或返回參數(shù)
{
inputFile = tempPath + "\\" + extension;
virtualPath = "~/" + inputFile.Replace(applicationPath, null);
}
if (Path.GetExtension(extension) == ".aspx")//如果是asp.net那么則把list復(fù)制給輸出參數(shù) qeryString
{
qeryString = qeryList;
}
}
return inputFile;
}
///summary>
/// 獲取指定目錄+文件是否有效
////summary>
///param name="inputFile">目錄/param>
///param name="fileName">/param>
///param name="extension">/param>
///returns>/returns>
private static string GetFileInfo(string inputFile, out string fileName, out string extension)
{
var tempPath = Directory.GetParent(inputFile).FullName;//獲取傳進(jìn)來目錄的父目錄
fileName = inputFile.Replace(tempPath + "\\", null);//獲取子目錄名稱
extension = Path.GetExtension(inputFile);//獲取擴(kuò)展名
if (string.IsNullOrWhiteSpace(extension))//如果擴(kuò)展名為null那么則認(rèn)為是aspx文件
{
extension = fileName + ".aspx";
}
else
{
extension = fileName + extension;
}
return tempPath;
}
#endregion
}
}

因?yàn)槲以谔幚韆spx頁面時(shí)還是傳入的重寫后的路徑,所有我們還有添加一個(gè)繼承IHttpHandlerFactory的類
代碼如下:
復(fù)制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.IO;
using System.Web.UI;
namespace MyClass
{
public class MyHttpHandlerFactory:IHttpHandlerFactory
{
#region IHttpHandlerFactory 成員
///summary>
/// 返回實(shí)現(xiàn) System.Web.IHttpHandler 接口的類的實(shí)例
////summary>
///param name="context">System.Web.HttpContext 類的實(shí)例,它提供對(duì)用于為 HTTP 請(qǐng)求提供服務(wù)的內(nèi)部服務(wù)器對(duì)象(如 Request、Response、Session和 Server)的引用/param>
///param name="requestType">客戶端使用的 HTTP 數(shù)據(jù)傳輸方法(GET 或 POST)/param>
///param name="url">所請(qǐng)求資源的 System.Web.HttpRequest.RawUrl/param>
///param name="pathTranslated">所請(qǐng)求資源的 System.Web.HttpRequest.PhysicalApplicationPath/param>
///returns>處理請(qǐng)求的新的 System.Web.IHttpHandler 對(duì)象/returns>
public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
Liststring> qeryString;
string virtualPath;
string inputFile =MyHttpModule.GetInputFile(context, out virtualPath, out qeryString);//這里跟那里是一樣的
object[] obj = new object[] { };
Dictionarystring, string> qeryStringDictionary = new Dictionarystring, string>();
var receiveMembers = System.Web.Compilation.BuildManager.GetCompiledType(virtualPath).GetMember("ReceiveParameters");//獲取訪問當(dāng)前頁面的所有ReceiveParameters成員 (這個(gè)是我自己加的,就是想做成和mvc的那種模式,但可能不是很好)
System.Reflection.MethodInfo receiveParameters=null;
if (qeryString != nullqeryString.Count>0)//如果查找到?jīng)]有參數(shù)則不去反射了
{
foreach (System.Reflection.MemberInfo receiveMember in receiveMembers)//遍歷所有ReceiveParameters成員
{
if (receiveMember.MemberType == System.Reflection.MemberTypes.Method)//因?yàn)樯厦娅@取到的是成員 但我們要的是方法所有要判斷下
{
System.Reflection.MethodInfo methodInfo = receiveMember as System.Reflection.MethodInfo;
if (methodInfo != null)
{
var parameters = methodInfo.GetParameters();//獲取ReceiveParameters方法的所有參數(shù)
int optionalCount = parameters.Count(i => i.IsOptional);//獲取ReceiveParameters參數(shù)里面有多少個(gè)可選參數(shù)
bool b = qeryString.Count == parameters.Length - optionalCount;
if (qeryString.Count == parameters.Length || b)//如果當(dāng)前查詢的參數(shù)或ReceiveParameters的所有參數(shù)-去可選擇的查詢參數(shù)相等
{
receiveParameters = methodInfo;//記錄這個(gè)方法
int i = 0;
obj = new object[parameters.Length];//記錄參數(shù)值,到后面調(diào)用ReceiveParameters時(shí)用
for (; i parameters.Length; i++)
{
string name = parameters[i].Name;//獲取參數(shù)的名稱
string value = string.Empty;
if (qeryString.Count > i)//如果ReceiveParameters參數(shù)沒到可選參數(shù)那么則去查詢的字符串
{
value = qeryString[i];
}
obj[i] = value;//把查詢的字符串保存起來,到后面調(diào)用ReceiveParameters時(shí)用
qeryStringDictionary.Add(name, value);//添加到自定義的集合里面
}
break;
}
}
}
}
if (receiveParameters == null)//判斷是否已經(jīng)找到,如果沒找到就把以前找的文件信息全部賦為重寫的文件信息,也就是不存在的
{
virtualPath = context.Request.Path;
inputFile = context.Request.PhysicalPath;
}
}
var temp= System.Web.UI.PageParser.GetCompiledPageInstance(virtualPath, inputFile, context);//編譯頁面
if (receiveParameters != null)//這個(gè)里面的內(nèi)容其實(shí)應(yīng)該寫到ReleaseHandler里面去的,但我寫在這里了
{
System.Web.UI.Page page = (System.Web.UI.Page)temp;
page.Init+=new EventHandler(page_Init);//添加一個(gè)事件 ,//還有就是本來應(yīng)該添加一個(gè)PageBase類的,那樣就可以把真實(shí)的路徑信息和查詢參數(shù)放進(jìn)去
sss = receiveParameters;
sssobj = obj;
//receiveParameters.Invoke(temp, obj);
}
return temp;
}
public System.Reflection.MethodInfo sss { get; set; }
public object[] sssobj { get; set; }
protected void page_Init(object sender, EventArgs e)
{
sss.Invoke(sender, sssobj);//當(dāng)page執(zhí)行到這里時(shí)就去調(diào)用ReceiveParameters方法 在這里還可以做其它的判斷。。。 但不符合編程規(guī)范(我的理解)
}
///summary>
/// 使工廠可以重用現(xiàn)有的處理程序?qū)嵗?
////summary>
///param name="handler">要重用的 System.Web.IHttpHandler 對(duì)象/param>
public void ReleaseHandler(IHttpHandler handler)
{
}
#endregion
}
}
頁面代碼就是多放幾個(gè)方法
///summary>
/// 一個(gè)參數(shù)的 如果需要多個(gè)則手動(dòng)添加如public void ReceiveParameters(string name,string value)等等 這樣頁面編譯后就會(huì)根據(jù)參數(shù)自動(dòng)運(yùn)行這個(gè)方法并轉(zhuǎn)遞參數(shù)值
////summary>
///param name="name">參數(shù)名稱為name/param>
public void ReceiveParameters(string name)
{
var temp = Request;
}

url的解決了,在來看看干掉試圖的。。。
我只寫了把事件的實(shí)體狀態(tài)去掉了,然后手動(dòng)去激發(fā)控件的事件,而且就是在url中寫里面解決的 代碼如下:
復(fù)制代碼 代碼如下:

protected void page_Init(object sender, EventArgs e)
{
sss.Invoke(sender, sssobj);
Page page = (Page)sender;
foreach (string name in page.Request.Form.AllKeys)//查找form里面所有的字典 其實(shí)應(yīng)該取__EVENTARGUMENT隱藏域的
{
try
{
System.Web.UI.Control control = page.FindControl(page.Page.Request.Form[name]);//查找這個(gè)控件
if (control != null)
{
string value = page.Request.Form[Page.postEventSourceID];
IPostBackEventHandler ip = control as IPostBackEventHandler;
if (ip != null)//能轉(zhuǎn)換成IPostBackEventHandler 那么就激發(fā)它
{
ip.RaisePostBackEvent(value);
break;
}
IPostBackDataHandler backDataHandler = control as IPostBackDataHandler;
if (backDataHandler != null)//能轉(zhuǎn)換成IPostBackDataHandler 就把__EVENTTARGET隱藏域的值傳給控件 然后激發(fā)更改事件
{
System.Collections.Specialized.NameValueCollection nameValueCollection=new System.Collections.Specialized.NameValueCollection();
nameValueCollection.Add(page.Request.Form[control.ClientID],page.Request.Form[control.ClientID]);
backDataHandler.LoadPostData(control.ClientID, nameValueCollection);
backDataHandler.RaisePostDataChangedEvent();
}
}
break;
}
catch
{
}
}
}

這樣簡單的處理就完了,
我希望各位來幫我改進(jìn)改進(jìn),因?yàn)槲耶吘惯€不太了解ASp.net的處理機(jī)制。。。
您可能感興趣的文章:
  • asp.net不用設(shè)置iis實(shí)現(xiàn)url重寫 類似偽靜態(tài)路由
  • ASP.NET中獲取URL重寫前的原始地址詳解
  • asp.net URL重寫簡化版 速學(xué)URL重寫
  • 一個(gè)完整的ASP.NET 2.0 URL重寫方案[翻譯]
  • asp.net url重寫淺談
  • asp.net下實(shí)現(xiàn)URL重寫技術(shù)的代碼
  • asp.net 2.0 中的URL重寫以及urlMappings問題
  • asp.net下用url重寫URLReWriter實(shí)現(xiàn)任意二級(jí)域名的方法
  • Asp.Net URL重寫的具體實(shí)現(xiàn)

標(biāo)簽:西雙版納 朔州 萊蕪 常州 許昌 孝感 自貢 信陽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《URL重寫及干掉ASP.NET試圖狀態(tài)的實(shí)現(xiàn)方法》,本文關(guān)鍵詞  URL,重寫,及,干掉,ASP.NET,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《URL重寫及干掉ASP.NET試圖狀態(tài)的實(shí)現(xiàn)方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于URL重寫及干掉ASP.NET試圖狀態(tài)的實(shí)現(xiàn)方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    亚洲理论在线观看| 国产在线一区观看| 亚洲欧美日韩国产综合在线| 久久久久久久久久美女| 欧美人妖巨大在线| 在线观看www91| 96av麻豆蜜桃一区二区| fc2成人免费人成在线观看播放| 蜜臀av亚洲一区中文字幕| 婷婷丁香激情综合| 亚洲一区二区三区美女| 一区二区三区蜜桃| 国产精品的网站| 中文字幕日韩av资源站| 中文字幕高清不卡| 欧美国产日韩在线观看| 国产午夜精品一区二区三区视频| 欧美不卡一区二区三区四区| 91精品麻豆日日躁夜夜躁| 日韩欧美中文一区二区| 久久综合av免费| 国产人成一区二区三区影院| 久久久久久久久伊人| 国产精品激情偷乱一区二区∴| 中文字幕在线一区二区三区| 18欧美乱大交hd1984| 亚洲主播在线播放| 日韩精品欧美精品| 国产成人在线视频网址| 成人在线视频首页| 欧美综合天天夜夜久久| 欧美一区二区三区影视| 久久九九99视频| 亚洲视频在线观看一区| 亚洲成人一区二区在线观看| 日韩电影在线看| 国产**成人网毛片九色| 色婷婷久久久综合中文字幕| 欧美一级艳片视频免费观看| 国产日韩欧美高清在线| 国产精品久久国产精麻豆99网站| 国产精品久久久久久久久久免费看| 亚洲精品一二三| 另类成人小视频在线| 懂色av噜噜一区二区三区av| 欧美日韩一卡二卡三卡| 欧美激情艳妇裸体舞| 午夜电影久久久| 成人av网站免费观看| 日韩一区二区三区视频在线| 国产欧美日韩精品一区| 曰韩精品一区二区| 国产成人午夜精品5599| 欧美日本韩国一区二区三区视频| 国产日韩视频一区二区三区| 丝袜亚洲另类欧美| 一本大道综合伊人精品热热| 久久久午夜电影| 日韩一区精品视频| 色香蕉成人二区免费| 欧美—级在线免费片| 美女爽到高潮91| 91超碰这里只有精品国产| 伊人婷婷欧美激情| a级高清视频欧美日韩| 国产欧美一区在线| 日本美女一区二区| 欧美日韩一区二区在线观看视频| 中文成人av在线| 国产精品自拍av| 欧美精品一区二区三区很污很色的 | 欧美日韩情趣电影| 亚洲乱码国产乱码精品精的特点| 国产乱子伦一区二区三区国色天香| 4438成人网| 视频一区视频二区在线观看| 在线观看日韩国产| 一区二区三区久久| 欧美亚洲国产一区在线观看网站| 亚洲视频一二三区| 97se狠狠狠综合亚洲狠狠| 国产精品国产三级国产普通话三级| 国产999精品久久久久久| 国产日韩欧美高清| 成熟亚洲日本毛茸茸凸凹| 亚洲国产精品99久久久久久久久| 国产主播一区二区| 欧美—级在线免费片| www.日本不卡| 亚洲成在人线在线播放| 欧美日韩成人综合天天影院 | 日韩精品福利网| 欧美一区二区三区公司| 国产精品资源在线看| 国产精品美女久久久久高潮| 色94色欧美sute亚洲线路一久| 亚洲午夜一区二区三区| 日韩一区二区免费在线观看| 国产一区二区三区在线观看免费视频| 久久精品一二三| 色综合久久久久| 美国一区二区三区在线播放| 国产日韩欧美高清在线| 欧美影院一区二区三区| 久久99国产精品久久| 中文字幕 久热精品 视频在线| 91激情五月电影| 久久国产精品色婷婷| 亚洲三级视频在线观看| 日韩欧美亚洲另类制服综合在线| 成人性生交大片免费看在线播放| 性感美女极品91精品| 国产亚洲精品超碰| 欧美久久久久免费| 91亚洲大成网污www| 狠狠色综合播放一区二区| 亚洲精品亚洲人成人网在线播放| 日韩女优电影在线观看| 一本一本大道香蕉久在线精品 | 亚洲影院久久精品| 26uuuu精品一区二区| 欧美日韩卡一卡二| av在线播放成人| 国产精品夜夜爽| 欧美aaaaaa午夜精品| 亚洲精品成人在线| 国产精品卡一卡二| 国产亚洲精久久久久久| 欧美另类变人与禽xxxxx| 91小视频免费观看| 国产夫妻精品视频| 韩国成人在线视频| 裸体健美xxxx欧美裸体表演| 亚洲成人自拍网| 亚洲精品国产精华液| 中文字幕一区二区在线播放| 精品国产免费视频| 欧美成人精精品一区二区频| 欧美日韩一级片在线观看| 色菇凉天天综合网| 色香色香欲天天天影视综合网| 成人h动漫精品| 91麻豆自制传媒国产之光| 成人免费视频视频| 成人精品电影在线观看| 成人丝袜高跟foot| 成人av午夜影院| 91小视频在线| 91黄视频在线观看| 在线播放欧美女士性生活| 欧美精品色一区二区三区| 欧美疯狂做受xxxx富婆| 91麻豆精品国产91| 欧美电影免费观看高清完整版在| 日韩免费福利电影在线观看| 久久日韩精品一区二区五区| 久久久噜噜噜久久中文字幕色伊伊| 久久久青草青青国产亚洲免观| 国产欧美日本一区二区三区| 国产精品欧美一区喷水| 一二三区精品福利视频| 日韩av高清在线观看| 国内精品伊人久久久久av一坑| 国产成人超碰人人澡人人澡| 99免费精品在线| 欧美日韩国产一区| 精品国产成人系列| 国产精品成人在线观看| 爽爽淫人综合网网站 | 五月天久久比比资源色| 麻豆成人免费电影| 99re这里只有精品首页| 欧美日韩视频专区在线播放| 欧美videofree性高清杂交| 国产精品久久午夜| 青娱乐精品视频| k8久久久一区二区三区| 欧美乱妇23p| 日韩美女久久久| 蜜臀av一区二区| 色就色 综合激情| 久久精品日韩一区二区三区| 一区二区三区日韩精品视频| 韩国午夜理伦三级不卡影院| 欧美综合一区二区| 国产精品国产三级国产有无不卡| 日本欧洲一区二区| 91精品91久久久中77777| 国产色爱av资源综合区| 日本欧美一区二区三区| 91免费精品国自产拍在线不卡 | 麻豆免费看一区二区三区| 91在线精品秘密一区二区| 精品少妇一区二区三区视频免付费| 亚洲人123区| 亚洲精品视频自拍| 日韩精品亚洲一区| 亚洲国产一区二区a毛片| 亚洲1区2区3区4区| 粉嫩一区二区三区性色av|