国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

HttpContext.Current并非無處不在

開發(fā) 后端
由于ASP.NET提供了靜態(tài)屬性HttpContext.Current,因此獲取HttpContext對象就非常方便了。也正是因為這個原因,所以我們經(jīng)常能見到直接訪問HttpContext.Current的代碼

了解ASP.NET的開發(fā)人員都知道它有個非常強大的對象 HttpContext,而且為了方便,ASP.NET還為它提供了一個靜態(tài)屬性HttpContext.Current來訪問它,今天的博客打算就從HttpContext.Current說起。

無處不在的HttpContext

由于ASP.NET提供了靜態(tài)屬性HttpContext.Current,因此獲取HttpContext對象就非常方便了。也正是因為這個原因,所以我們經(jīng)常能見到直接訪問HttpContext.Current的代碼:

  1. public class Class1  
  2. {  
  3.     public Class1()  
  4.     {  
  5.         string file = HttpContext.Current.Request.MapPath("~/App_Data/xxxxxx.xml");  
  6.  
  7.         string text = System.IO.File.ReadAllText(file);  
  8.  
  9.         //..........其它的操作  
  10.     }  
  11.  
  12.     // 或者在一些方法中直接使用HttpContext.Current  
  13.     public void XXXXX()  
  14.     {  
  15.         string url = HttpContext.Current.Request.RawUrl;  
  16.  
  17.         string username = HttpContext.Current.Session["username"].ToString();  
  18.  
  19.         string value = (string)HttpContext.Current.Items["key"];  
  20.     }  
  21.  
  22.     // 甚至還設(shè)計成靜態(tài)屬性  
  23.     public static string XXX  
  24.     {  
  25.         get 
  26.         {  
  27.             return (string)HttpContext.Current.Items["XXX"];  
  28.         }  
  29.     }  
  30. }  

這樣的代碼,經(jīng)常能在類庫項目中看到,由此可見其泛濫程度。

難道這些代碼真的沒有問題嗎?

有人估計會說:我寫的代碼是給ASP.NET程序使用的,又不是給控制臺程序使用,所以沒有問題。

真的是這樣嗎?

HttpContext.Current到底保存在哪里?

的確,在一個ASP.NET程序中,幾乎任何時候,我們都可以訪問HttpContext.Current得到一個HttpContext對象,然而,您有沒有想過它是如何實現(xiàn)的呢?

如果您沒有想過這個事情,那我今天就來告訴您吧。請看下面的代碼

  1. protected void Page_Load(object sender, EventArgs e)  
  2. {  
  3.     HttpContext context1 = HttpContext.Current;  
  4.  
  5.     HttpContext context2 = System.Runtime.Remoting.Messaging.CallContext.HostContext as HttpContext;  
  6.  
  7.     bool isEqual = object.ReferenceEquals(context1, context2);  
  8.  
  9.     Response.Write(isEqual);  
  10. }  

猜猜會顯示什么? 

這就是我看到的結(jié)果,不信的話您也可以試試。

從這段代碼來看,HttpContext其實是保存在CallContext.HostContext這個屬性中,如果您還對HostContext感到好奇的話,您可以自己用Reflector.exe去看,我不想再貼代碼了,因為有些類型和方法并不是公開的。

我們還是來看看MSDN是如何解釋CallContext.HostContext的吧:

獲取或設(shè)置與當(dāng)前線程相關(guān)聯(lián)的主機上下文。

這個解釋非常含糊,不過有二個關(guān)鍵詞我們可以記下來:【當(dāng)前線程】,【關(guān)聯(lián)】。

是說:和當(dāng)前線程相關(guān)聯(lián)的某個東西嗎?

我是這樣理解的。

我們在一個ASP.NET程序中,為什么可以到處訪問HttpContext.Current呢?

因為ASP.NET會為每個請求分配一個線程,這個線程會執(zhí)行我們的代碼來生成響應(yīng)結(jié)果,即使我們的代碼散落在不同的地方(類庫),線程仍然會執(zhí)行它們,所以,我們可以在任何地方訪問HttpContext.Current獲取到與【當(dāng)前請求】相關(guān)的HttpContext對象,畢竟這些代碼是由同一個線程來執(zhí)行的嘛,所以得到的HttpContext引用也就是我們期待的那個與請求相關(guān)的對象。

因此,將HttpContext.Current設(shè)計成與【當(dāng)前線程】相關(guān)聯(lián)是合適的。

HttpContext并非無處不在!

【當(dāng)前線程】是個什么意思? 我為什么要突出這個詞呢?

答:

1. 當(dāng)前線程是指與【當(dāng)前請求】相關(guān)的線程。

2. 在ASP.NET中,有些線程并非總是與請求相關(guān)。

感覺有點繞口嗎? 不容易理解嗎? 還是繼續(xù)往下看吧。

雖然在ASP.NET程序中,幾乎所有的線程都應(yīng)該是為響應(yīng)請求而運行的,

但是,還有一些線程卻不是為了響應(yīng)請求而運行,例如:

1. 定時器的回調(diào)。

2. Cache的移除通知。

3. APM模式下異步完成回調(diào)。

4. 主動創(chuàng)建線程或者將任務(wù)交給線程池來執(zhí)行。

在以上這些情況中,如果線程執(zhí)行到HttpContext.Current,您認(rèn)為會返回什么?

還是一個HttpContext的實例引用嗎?

如何是,那它與哪個請求關(guān)聯(lián)?

顯然,在1,2二種情況中,訪問HttpContext.Current將會返回 null 。

因為很有可能任務(wù)在運行時根本沒有任何請求發(fā)生。了解異步的人應(yīng)該能很容易理解第3種情況(就當(dāng)是個結(jié)論吧)

第4種情況就更不需要解釋了,因為確實不是當(dāng)前線程。

既然是這樣,那我們再看一下本文開頭的一段代碼:

  1. public Class1()  
  2. {  
  3.     string file = HttpContext.Current.Request.MapPath("~/App_Data/xxxxxx.xml");  
  4.  
  5.     string text = System.IO.File.ReadAllText(file);  
  6.  
  7.     //..........其它的操作  

想像一下:如果Class1是在定時器回調(diào)或者Cache的移除通知時被創(chuàng)建的,您認(rèn)為它還能正常運行嗎?

此刻您心里應(yīng)該有答案了吧?

可能您會想:為什么我在其它任何地方又可以訪問HttpContext.Current得到HttpContext引用呢?

答:那是因為ASP.NET在調(diào)用您的代碼前,已經(jīng)將HttpContext設(shè)置到前面所說的CallContext.HostContext屬性中。

HttpApplication有個內(nèi)部方法OnThreadEnter(),ASP.NET在調(diào)用外部代碼前會調(diào)用這個方法來切換HttpContext,例如:每當(dāng)執(zhí)行管線的事件處理器之前,或者同步上下文(AspNetSynchronizationContext)執(zhí)行回調(diào)時。切換線程的CallContext.HostContext屬性之后,我們的代碼就可以訪問到HttpContext引用。注意:HttpContext的引用其實是保存在HttpApplication對象中。

有時候我們會見到【ASP.NET線程】這個詞,今天正好來說說我對這個詞的理解:當(dāng)前線程是與一個HttpContext相關(guān)的線程,由于線程與HttpContext相關(guān)聯(lián),也就意味著它正在處理發(fā)送給ASP.NET的請求。注意:這個線程仍然是線程池的線程。

如何獲取文件絕對路徑?

在定時器回調(diào)或者Cache的移除通知中,有時確實需要訪問文件,然而對于開發(fā)人員來說,他們并不知道網(wǎng)站會被部署在哪個目錄下,因此不可能寫出絕對路徑,他們只知道相對于網(wǎng)站根目錄的相對路徑,為了定位文件路徑,只能調(diào)用HttpContext.Current.Request.MapPath或者 HttpContext.Current.Server.MapPath來獲取文件的絕對路徑。如果HttpContext.Current返回了null,那該如何如何訪問文件?

其實方法并非MapPath一種,我們可以訪問HttpRuntime.AppDomainAppPath獲取網(wǎng)站的路徑,然后再拼接文件的相對路徑即可:

看到?jīng)]:圖片中HttpContext.Current顯示的是 null ,所以您要是再調(diào)用MapPath,就必死無疑!

在此我也奉勸大家一句:盡量不要用MapPath,HttpRuntime.AppDomainAppPath才是更安全的選擇。

異步調(diào)用中如何訪問HttpContext?

前面我還提到在APM模式下的異步完成回調(diào)時,訪問HttpContext.Current也會返回null,那么此時該怎么辦呢?

答案有二種:

1. 在類型中添加一個字段來保存HttpContext的引用(異步開始前)。

2. 將HttpContext賦值給BeginXXX方法的最后一個參數(shù)(object state)

建議優(yōu)先選擇第二種方法,因為可以防止以后他人維護時數(shù)據(jù)成員被意外使用。

安全地使用HttpContext.Current

有時我們會寫些通用類庫給ASP.NET或者WindowsService程序來使用,例如異常記錄的工具方法。對于ASP.NET程序來說,我們肯定希望在異常發(fā)生時,能記錄URL,表單值,Cookie等等數(shù)據(jù),便于事后分析。然而對于WindowsService這類程序來說,您肯定沒想過要記錄Cookie吧?那么如何實現(xiàn)一個通用的功能呢?

方法其實也簡單,就是要判斷HttpContext.Current是否返回null,例如下面的示例代碼:

  1. public static void LogException(Exception ex)  
  2. {  
  3.     StringBuilder sb = new StringBuilder();  
  4.     sb.Append("異常發(fā)生時間:").AppendLine(DateTime.Now.ToString());  
  5.     sb.AppendLine(ex.ToString());  
  6.  
  7.     // 如果是ASP.NET程序,還需要記錄URL,F(xiàn)ORM, COOKIE之類的數(shù)據(jù)  
  8.     HttpContext context = HttpContext.Current;  
  9.     if( context != null ) {  
  10.         // 能運行到這里,就肯定是在處理ASP.NET請求,我們可以放心地訪問Request的所有數(shù)據(jù)  
  11.         sb.AppendLine("Url:" + context.Request.RawUrl);  
  12.  
  13.         // 還有記錄什么數(shù)據(jù),您自己來實現(xiàn)吧。  
  14.     }  
  15.  
  16.     System.IO.File.AppendAllText("日志文件路徑", sb.ToString());  
  17. }  

就是一個判斷,解決了所有問題,所以請忘記下面這類不安全的寫法吧:

  1. HttpContext.Current.Request.RawUrl;  
  2. HttpContext.Current.Server.MapPath("xxxxxx"); 

下面的方法才是安全的:

  1. HttpContext context = HttpContext.Current;  
  2. if( context != null ) {  
  3.     // 在這里訪問與請求有關(guān)的東西。  
  4. }  

原文鏈接:http://www.cnblogs.com/fish-li/archive/2013/04/06/3002940.html

責(zé)任編輯:張偉 來源: 博客園
相關(guān)推薦

2017-09-14 18:02:53

傷害學(xué)神挑戰(zhàn)

2022-09-16 10:44:17

物聯(lián)網(wǎng)通信網(wǎng)絡(luò)

2017-12-29 10:54:01

Python編程語言系統(tǒng)管理工具

2014-04-23 13:08:04

Dockerlinux

2013-11-11 15:04:52

2024-06-03 17:24:34

2013-12-30 10:05:54

Linux操作系統(tǒng)

2023-08-18 14:39:52

5G4G

2021-10-29 15:30:37

SASE/網(wǎng)絡(luò)安全

2015-01-08 15:31:22

CES2015智能硬件HomeKit

2009-03-30 11:58:03

2010-06-03 15:38:30

2011-07-05 10:41:17

webOS

2021-10-29 15:05:57

網(wǎng)絡(luò)安全爬蟲技術(shù)

2011-08-25 13:45:31

應(yīng)用交付F5John McAdam

2021-02-18 16:41:26

大數(shù)據(jù)疫情物聯(lián)網(wǎng)

2013-06-09 09:32:24

PC云計算

2017-10-13 16:17:39

2013-01-28 15:08:12

Windows Pho設(shè)計

2010-11-07 21:27:38

點贊
收藏

51CTO技術(shù)棧公眾號

日韩精品中文字幕一区二区三区| 中文字幕第一区二区| 国产精品久久久久久久久影视| 色999韩欧美国产综合俺来也| 岛国av一区二区三区| 中文在线一二区| 婷婷成人激情在线网| 黄色免费在线看| 中文字幕精品一区二区精品| 在线观看av网站| 一区二区三区四区五区在线| 中国china体内裑精亚洲片| 国产一级网站视频在线| 在线观看一区日韩| 成人短视频在线| 美女网站视频久久| 91精品国产自产在线老师啪 | 久久福利视频一区二区| 农村寡妇一区二区三区| 在线精品观看| 国产区日韩欧美| 久久久久97| 欧美一区二区三区免费视频| 中国丰满熟妇xxxx性| 中文字幕日韩欧美精品高清在线| 午夜精品在线视频| 久久91精品| 国产在线久久久| 青青草手机在线| 色呦呦国产精品| 色呦呦在线视频| 久久夜色精品国产| 99热国产在线| 亚洲美女黄色片| 97青娱国产盛宴精品视频| 欧美成人午夜剧场免费观看| gogo久久日韩裸体艺术| 国产精品一香蕉国产线看观看| 波多野结衣亚洲| 欧美专区中文字幕| 亚洲午夜一区二区三区| 国内外成人免费在线视频| 在线观看日韩电影| 国内av一区二区三区| 黄色一区二区在线观看| 波多野结衣作品集| 欧美日韩精品在线播放| 国产在线xxx| 疯狂蹂躏欧美一区二区精品| 狂野欧美激情性xxxx欧美| 欧美性大战xxxxx久久久| 亚洲精品男人| 9191国产精品| 麻豆最新免费在线视频| 337p亚洲精品色噜噜噜| 亚洲大胆人体大胆做受1| 国产97在线播放| 日本女人一区二区三区| 俄罗斯xxxx性全过程| 亚洲国产精品久久久久秋霞不卡| 久久这里只有精品一区二区| 天堂а√在线中文在线| 精品久久久久久久久国产字幕| 色网视频在线| 国内精品久久久| 91麻豆123| av剧情在线观看| 免费看国产精品一二区视频| 在线观看91精品国产入口| 人人狠狠综合久久亚洲婷| 欧美成人福利在线观看| 亚洲成人福利片| av网站大全在线| 日韩中文字幕精品视频| 色先锋久久影院av| 久久手机在线视频| 亚洲欧美国产精品久久久久久久 | 国产精品女主播av| 午夜两性免费视频| 色婷婷久久99综合精品jk白丝| 中日韩免视频上线全都免费| 成人天堂入口网站| 欧美美女网站色| 精品国产123区| 动漫成人在线观看| 国产噜噜噜噜噜久久久久久久久| 欧美日韩精品在线播放| 免费亚洲一区| 久久久精品一区二区毛片免费看| 天堂а√在线中文在线| 欧美区二区三区| 亚洲三级小视频| 国产精品二区影院| 国产二区视频在线观看| 91精品黄色| 亚洲第一黄色网| 黄一区二区三区| 九七电影院97理论片久久tvb| 最近中文字幕一区二区| 欧美中文字幕在线| 亚洲一区二区视频在线观看| 国产成人1区| 国产黄a三级三级三级av在线看| 久久999免费视频| 激情综合网最新| 成人嫩草影院| 在线免费日韩| 欧洲精品在线视频| 日韩一级在线观看| 亚洲h色精品| 日韩大片免费观看| 国产精品一二区| 亚洲国产精品成人va在线观看| 日韩av成人高清| 青青青草原在线| 国产成人精品免高潮在线观看| 99精品国产热久久91蜜凸| 蜜桃成人精品| 毛片在线网址播放| 国产一区二区高清视频| 精品视频一区三区九区| 欧美黄色录像片| 亚洲第一视频在线观看| 日韩精品一级中文字幕精品视频免费观看| 亚洲伦理影院| 久久久加勒比| 日韩午夜电影免费看| 久久久精品免费视频| 国产精品久久久久av蜜臀| 欧美精品在线一区| 国产精品国产三级国产普通话99| 日本不卡在线| 亚洲国产日韩美| 亚洲欧美国产毛片在线| 91麻豆精品一二三区在线| 日本亚洲自拍| 国产丝袜一区二区三区| 日韩专区中文字幕一区二区| 久草在现在线| 高清日韩一区| 色综合久久99| 精品精品国产毛片在线看 | 亚洲欧美综合另类在线卡通| 日韩久久一区二区三区| 日韩精品一区二区三区四| 精品国产一区二区三区日日嗨| 91免费视频网站| 国产婷婷一区二区三区| 国产精品久久久久999| av女优在线播放| 麻豆tv免费在线观看| 色综合www| 久久亚洲综合色| 欧美日韩dvd在线观看| 欧美一个色资源| 亚洲va欧美va天堂v国产综合| 九九视频精品免费| 久久亚洲影院| 99在线热播精品免费99热| 欧美系列电影免费观看 | 91文字幕巨乱亚洲香蕉| 91影视免费在线观看| 久久久久久久免费| 国产精品免费成人| 9191国语精品高清在线| 美女久久久久| 成人免费高清在线观看| 欧美男人的天堂一二区| 欧美一级专区免费大片| 91精品国产免费久久综合| 欧美色大人视频| 欧美变态口味重另类| 欧美精品一区二区在线播放| 热久久美女精品天天吊色| 国产精品女主播视频| 91久久久国产精品| 欧美人与物videos另类| 在线精品日韩| 色多多视频在线观看| 欧美精品99| 国产激情一区二区三区四区| 激情伊人五月天久久综合| 亚洲成人7777| 亚洲精品视频一二三| 日韩精品免费一区| 无码人妻丰满熟妇区毛片18| www视频在线免费观看| jvid福利在线一区二区| 日本资源在线| 91久久嫩草影院一区二区| 色综合久久中文字幕综合网| 国产农村妇女精品一区二区| jizz内谢中国亚洲jizz| 青青草av网站| 亚洲影院色无极综合| 日韩禁在线播放| 国产精品欧美经典| 亚洲美女一区| 欧美久久一区二区三区| 成人18在线|