定时发布任务,在global.asax中获取文件的物理路径的方法
如果要把一個相對路徑或者虛擬路徑映射道服務器的物理路徑,通常會使用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獲取應用程序的物理根目錄,有了這個根目錄就可以獲取所有文件的物理路徑了。
總結
以上是生活随笔為你收集整理的定时发布任务,在global.asax中获取文件的物理路径的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个税等级
- 下一篇: 学习 WCF (1)--基础篇