定時發布任務,在global.asax中擷取檔案的實體路徑的方法【asp.net】

來源:互聯網
上載者:User

原文地址:定時發布任務,在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擷取應用程式的物理根目錄,有了這個根目錄就可以擷取所有檔案的實體路徑了。

其實,我還有個部落格:貓貓的園地

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.