none
DLL靜態類別取得HttpContext裡的資料 RRS feed

  • 問題

  • 目前在撰寫一個DLL,裡面會去引用網頁中的HttpContext
    該類別會取得HttpContext

    MyConfig.dll

    public static MyConfig
    {
     public string RootPath;
     static MyConfig()
     {
      MyConfig.RootPath = HttpContext.Current.Server.MapPath("/") ;
     }
    }

    該DLL有引用System.Web
    而這麼寫,是可以正確取得的
    但在測試專案時,常出現例外錯誤
    追縱下發現錯誤是在DLL中,HttpContext.Current是null
    以致於這段程式碼是時好時壞的
    不確定問題點出在哪使httpContext沒有如預期中事先載入

    而我有寫其他DLL
    如MyLog.dll
    裡面亦有引用MyConfig.dll
    亦即使用的範圍涵蓋
    1.WebApplication
    2.OtherDll

    想請問各位前輩們有遇過相關問題嗎?不知這該如何解決

    2010年4月26日 上午 03:19

解答

  • 我想這可能是因為 static變數本身就是載入時就會作初始化.
    而HttpContext可能尚未建立,而導致時好時壞,但這要深入了解ASP.Net的模型才會知道原因.
    不過這種不確定性如果確認,你想的方式是比較正確的做法.

    • 已標示為解答 Lolota Lee 2010年5月4日 上午 09:33
    2010年4月27日 上午 09:18

所有回覆

  • >>在測試專案時,常出現例外錯誤
    因為測試專案並不是一個Web application專案當然DLL的 HttpContext.Current.Server會是NULL

    因此你應該把你要測試的DLL這部分的Code將與HttpContext有關的Code分離開來,不然就是使用Mock機制自行創造出HttpContext的 Mock類別(不過這並不容易,且通常沒有必要).

    2010年4月26日 上午 03:29
  • 感謝前輩指點
    可是目前我使用測試模式,或直接在IIS去RUN該頁,同樣都會引發null(並未將物件參考設定為物件的執行個體 )
    目前我是有打算把static MyConfig去掉
    增加一個方法去Load
    然後在Globa.asa中的Application.Start去呼叫他,我想這樣應能解決

    目前有使用
    1.WebApplication(引用MyConfig)
    2.MyConfig(引發null錯誤)
    3.MyLog(引用MyConfig)
    不解的是,為何會時好時壞,靜態類別建構子的載入時機與WebApplication的優先順序為何,是否都是不固定的呢?

    2010年4月26日 上午 03:35
  • 我想這可能是因為 static變數本身就是載入時就會作初始化.
    而HttpContext可能尚未建立,而導致時好時壞,但這要深入了解ASP.Net的模型才會知道原因.
    不過這種不確定性如果確認,你想的方式是比較正確的做法.

    • 已標示為解答 Lolota Lee 2010年5月4日 上午 09:33
    2010年4月27日 上午 09:18
  • 查得出來是在什麼時機點下呼叫會拋出例外嗎?

    2010年4月27日 上午 10:20
  • 在網站初始化時,DLL中的DLL取用時會出錯(某一DLL的建構子沒有抓到導致後續錯誤)

    目前我先趕一下進度,此部份會再抽空測試,感謝各位前輩指導

    2010年5月4日 上午 09:42