none
可以檔案共用?? RRS feed

  • 問題

  •  

    各位達人好,

     

    關於多專案開發時,請問可以有共用的架構嗎??

     

    像connection、web.config 等等??

     

    感謝您!!

    2008年1月24日 上午 11:04

所有回覆

  • 網頁系統的 Connection 不適合共用,因為共用會持續佔用資源,且同時存取時,會有鎖定與交錯的問題。

     

    web.config 的問題不是共用,而是繼承,在 asp.net 版搜尋 web.config 繼承就有答案:

    http://forums.microsoft.com/MSDN-CHT/Search/Search.aspx?words=web.config+%u7e7c%u627f&localechoice=31748&SiteID=14&searchscope=forumscope&ForumID=236

     

    2008年1月24日 下午 12:22
  • 謝謝璉大!!

     

    我是將連線字串放在web.config裡公用,然後在.cs裡 :

    try
                {
                    using (SqlConnection conn = new SqlConnection())
                    {
                        ConnectionStringSettingsCollection ConnectionStrings = ConfigurationManager.ConnectionStrings;
                        conn.ConnectionString = ConnectionStrings[0].ToString();
                        conn.Open();

    這樣也會有問題?? 請指導!!

     

    現在加入另一個window service專案了,使用到的連線字串相同,所以想請問有沒有公用的方法??

     

    感謝您!!

     

    2008年1月25日 上午 01:10
  • 放在 web.config 只是字串參數共用,不代表連線共用。

     

    如果你是放在兩個平等的虛擬目錄,不能這樣直接共用,可以改 machie.config 達到全系統共用,不過一般不會這樣搞。

     

    這種情況不如另外開個目錄放文字參數的檔案,我自己習慣是用 ini 檔,然後大家都讀那個檔案即可,該目錄在 IIS 下設為不可讀取,就不怕被遠端偷走。

    此外,也可以寫入系統的 DSN ,兩個連線都存取該 DSN 也是一種共用連線字串的方式。

     

    多個 Web Service 可以放在同一虛擬目錄下的不同子目錄,這時在這個虛擬目錄下的 web.config 就會分別被兩個子目錄繼承。

     

    2008年1月25日 上午 03:43
  • 感謝回覆!!

     

    請問璉大,您提的ini檔可以多專案(同方案)共用??

     

    在一個方案含多專案的時候,想要把一些參數寫成公用文字檔的話,可行嗎???

     

    另外,在windows service中讀取檔案怎麼用?? 沒有Service.MapPath可用,他說不認識.....

     

    請指導!!

    謝謝您!!

    2008年1月25日 上午 05:47
  • 可以阿~ 你可以用絕對路徑或相對路徑,放參數的檔案記得要開讀取權限給 ASPNET 帳戶或 Network Service 群組,此外開檔時,用唯讀、分享 (Shared) 旗標開檔讀,避免多專案同時存取時造成鎖定。

     

    你可以用 HttpServerUtility.MapPath 來處理相對路徑試看看。

    2008年1月25日 上午 06:45
  •  

    在window service專案裡,也不認識 HttpServerUtility.MapPath.....

    2008年1月25日 上午 06:52
  • 我剛剛開個空的 VB Service 專案可以辨識 Server.MapPath ,你會不會拼錯字了?

    Code Snippet

    <WebMethod()> _

    Public Function TestMapPath(ByVal strVPath As String) As String

         Return Server.MapPath(strVPath)

    End Function

     

     

    測試可以正常跑~

     

    2008年1月25日 上午 08:25
  • 璉大,他說的是 Windows Service,你用的是 Web Service,是兩回事。

     

    如果要用在 Windows Service,最好還是透過 Registry 來共享比較好。

    存取法請搜尋 Microsoft.Win32.RegistryKey。

     

    2008年1月25日 上午 08:40
    版主
  • 我前面一開始看到他寫到 web.config ,以為是 Web Service ...

     

    若是 Windows Service ,早期連微軟都是共用在 System Directory 目錄下的 ini 檔,後來才換到註冊資訊檔。

    2008年1月25日 上午 09:06

  • 璉璉大 您好

    很抱歉誤導您!! 請見諒!!
    關於您提到的註冊資訊檔,就是ini檔嗎? 或xml檔嗎?? 只要在註冊表加key,value 寫上檔案路徑嗎? 若是這樣的思路,那路徑就是絕對路徑囉(自己想的)!! 那可以用相對路徑嗎??

    也謝謝小朱大的指導,只是太精煉了,還在Google中,希望您再指導些!!  謝謝您!!

    2008年1月28日 上午 03:07
  • 註冊資訊檔指的是 regedit 開啟的登錄樹,也就是小朱寫的 Registry。

     

    ini 檔的專有名詞叫做剖析檔 (ProFile)

     

    Windows Service 可以當成一般 Windows 應用程式 (WinApps) 的概念去想,只是用系統帳號跑在一個不可見的桌布上。

     

    一般來說,WinApps 共用設定檔只會放在系統目錄內,這就沒有絕對路徑或相對路徑的討論,因為都是透過函數或環境變數取得系統路徑,得到最後的絕對路徑,當然不是不可能放相對路徑,但是因為通常 WinApps 是可變更安裝路徑,所以不能預期使用者是否安裝在指定目錄結構下,所以才會把共用檔案放在系統路徑內。

     

    所以 Windows Service 慣例上是用註冊資訊檔來共用資訊,只有剛進 Win32 那個年代會在系統目錄下放 ini 檔來共用,到 WinNT 年代已經很少這樣做了,當然不是沒有。

    2008年1月28日 上午 03:27

  • 謝謝 璉璉大!

    可是,之所以想要用一個xml(或ini檔),因考慮有多個變數...
    我發現有.setting檔和Application Configuation File
    App.config 檔可以設定連線字串等一些自定變數,
    再用 ConnectionString = ConfigurationSettings.AppSettings["ConnectionString"]; 讀取..
    可問題來了,若在config檔更改連線字串,Service 程式還要重新build並安裝,那感覺跟直接修改程式碼並無不同,
    好像失去他的方便性,怎麼會這樣?? 或許這是Service專案的特殊情形?? 還是一般專案的 config 檔也是一樣??  盼各位達人解惑!!

    感謝您!!
    2008年1月28日 上午 03:38
  • 那是看你把讀 Connection String 的程式擺哪吧。

    只擺在建構式,那當然就要重編再安裝啊。

     

    如果你把它擺到 OnStart 的事件常式,就只要重新啟動服務就行了。

    2008年1月28日 上午 07:11
    版主
  • 謝謝小朱大的回覆!!

    不過我就放在 OnStart 的事件常式 中...
    2008年1月28日 上午 07:25
  • 那就要看你是怎麼寫的了。

    2008年1月28日 上午 07:29
    版主
  • 謝謝小朱大!!
    以下是程式片段,請指導

    Service1.cs中

    using System.Configuration;

    protected override void OnStart(string[] args)
              {
                // TODO: Add code here to start your service.
                string timeInterval;
                timeInterval = ConfigurationSettings.AppSettings["timeInterval"];

    app.config中

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings> 
        <add key ="timeInterval" value ="60" />   
      </appSettings>
    </configuration>

    謝謝您!!
    2008年1月28日 上午 07:35
  • 老大,你有沒有在服務啟動或重新啟動的時候,試著輸出你的 timeInterval 看看(用除錯器或事件記錄器輸出)?

    還有,是在改完組態檔後才重新啟動,而不是重新啟動後再改。

     

    2008年1月28日 上午 07:40
    版主
  • 小朱大,您好

    我把服務停掉,修改config檔,儲存,重起服務,結果事件記錄器輸出的的確是舊資料。
    不過還是謝謝您!! 了解到
    事件記錄器可以這樣用!!

    2008年1月28日 上午 08:04