2011-08-24 69 views
2

我試圖創建一個從Linq-to-SQL數據訪問層提取數據的Windows服務。對於DAL,我使用外部XML映射文件。部署並使用用於Windows服務的靜態內容

事情似乎建立罰款,但我安裝服務,並嘗試後,啓動它,我收到以下錯誤:

Service cannot be started. System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Windows\system32\Generated\SpiSytelineMapping.xml'.

首先,我想弄清楚爲什麼它尋找映射system32目錄中的文件而不是服務可執行文件所在的目錄。

即使如此,當我瀏覽到system32目錄時,我驚訝地發現內容文件確實在那裏複製。

C:\Windows\System32\Generated>dir 

Directory of C:\Windows\System32\Generated 

08/24/2011 02:32 PM <DIR>   . 
08/24/2011 02:32 PM <DIR>   .. 
08/24/2011 02:09 PM   447,079 AbcSytelineMapping.xml 
08/24/2011 02:09 PM   442,374 HtiSytelineMapping.xml 
01/19/2011 05:07 PM   445,155 MpiCorpSytelineMapping.xml 
08/24/2011 02:09 PM   464,353 SpiSytelineMapping.xml 
08/24/2011 02:09 PM   440,483 SytelineMapping.xml 
       5 File(s)  2,239,444 bytes 
       2 Dir(s) 56,826,531,840 bytes free 

由於文件都在那裏,我的第一個假設是,這是一個權限問題,但目錄和文件已閱讀「每個人的權限,我試圖開始下「管理員」服務,'本地服務「,」本地系統「和我的帳戶(也是管理員帳戶,全部失敗,出現同樣的錯誤)

值得注意的是,這些文件也出現在應用程序的可執行文件的安裝目錄中

任何人都可以對我在這裏可能發生的事情有所瞭解嗎?

回答

1

當Windows服務啓動,它開始是從事C:\ Windows \ System32下,也許你可以加載您的映射時,做到這一點:

string connStr = "server=.;database=AdventureWorksLT;integrated security=true;"; 
string currentPath=System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)); 
using (CustomDataContext context = new CustomDataContext(connStr, XmlMappingSource.FromUrl(currentPath+"\\CustomerMapping.xml"))) 
{ 

} 

要強制從那裏位於當前目錄加載XML的windows服務。

+0

這是有效的,我認爲它在我的其他應用程序中也會更清潔,這些應用程序也使用此Linq-to-SQL類庫。謝謝你的幫助。 –

1

雖然上述作品,我發現它更好的嵌入映射文件作爲一種資源,並從那裏與以下加載:

private static string GetXmlMapping() 
    { 
     Stream xmlStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Mpicorp.SytelineDataModel.Generated.SytelineMapping.xml"); 
     StreamReader streamReader = new StreamReader(xmlStream); 
     return streamReader.ReadToEnd(); 
    } 

這是非常簡單和更優雅的;我的數據訪問層現在更容易部署。當我發表我的原始文章時,我完全不知道這種方法。也許這可能對有同樣困境的人有用。