原文地址:定時發布任務,在global.asax中擷取檔案的實體路徑的方法【asp.net】
http://blog.mm-share.cn/post/125.html
如果要把一個相對路徑或者虛擬路徑映射道伺服器的實體路徑,通常會使用Server.MapPath()函數,比如將根目錄下的html目錄映射為實體路徑:Server.MapPath("html"),可以返回形如"E:\www\htm\"的字串。通常情況下我們都不會遇到什麼問題。
新手常常會發現在諸如自己的類檔案中無法使用Server.MapPath(),這是由於沒有引入相應的命名空間,只要把全名寫出來,即用System.Web.HttpContext.Current.Server.MapPath(),問題就迎刃而解了。
最近老闆讓我做一個可以定時發布文章的CMS,他的意思是做一個網站,但是他不想管理這個網站,只是想一個月來管一次,但是又要保持網站每天更新(真是夠懶的,想得還真美)。就是說網站每天會自己更新,多麼好的網站啊。這裡面我首先想到的是使用定時器,但是web程式是相當被動的,只有當使用者請求時,它才會工作,這個問題困擾了我很久。
不過還好,幾經周折才找到可以在global.asax中實現這種功能,該檔案是一個網站應用程式程式可選的通用檔案,定義了有很多事件,其中的Application_Start()函數可以在整個網站應用程式程式啟動時被觸發,因此我就在這裡觸發一個定時器,通過這個定時器不斷觸發我的定時發發布函數。
定時發布功能我做到了一個類裡面,類裡面用到了Server.MapPath(),但是這個類真的好奇怪,我在其他地方調用時都可以工作正常,但是在global.asax中調用是老是在MapPath()一行提示“未將對象引用設定到對象的執行個體”的錯誤。弄了N久也沒有結果,鬱悶至極,上網搜了N久,又到百度知道中花了200分懸賞也沒有得到答案,千篇一律的給出使用Server.MapPath(),而這是根本不行的。
經過鑽研,發現原來在global.axax中並沒有請求上下文,因此System.Web.HttpContext是Null,更不要說使用其成員了,所以這條路是走不通了。難道就沒有其他擷取實體路徑的方法了嗎?又是一番周折,我發現了HttpRuntime這個神奇的類,它並不需要請求上下文,而它恰好有一個熟悉AppDomainAppPath,給出了當前應用程式的根目錄,有了這個東西,加上我已知的虛擬路徑不久得到了我相應的檔案的實體路徑了嗎。試了一下,果然實現了,呵呵,一個困難又被我解決了。
總結一下:如果沒有請求上下文System.Web.HttpContext就是空值,自然不能實現任何功能。如果想在這種情況下得到實體路徑可以使用HttpRuntime.AppDomainAppPath擷取應用程式的物理根目錄,有了這個根目錄就可以擷取所有檔案的實體路徑了。
其實,我還有個部落格:貓貓的園地