2012-01-26 57 views
0

我剛剛在C#2010中編寫了一個測試服務。在OnStart方法中,我打開C:驅動器根目錄中的XML文檔,解析它並寫出另一個XML文件也在C:驅動器的根目錄中。C#服務不會寫入XML

當我安裝服務並啓動它時,im告訴它自動停止。輸出XML文件已創建,但爲空。我以本地系統帳戶運行該服務。

誰能告訴我爲什麼沒有內容被寫入?

感謝,

編輯(包括對的OnStart代碼)...

protected override void OnStart(string[] args) 
{ 
    String win32ClassName = ""; 
    String nodeSubkeyName = ""; 
    List<String> propertyList = new List<String>(); 
    List<String> propertyListQuery = new List<String>(); 

    XmlTextReader reader = new XmlTextReader("C:\\hwin.xml"); 
    XmlTextWriter writer = new XmlTextWriter("C:\\hwout.xml", null); 
    writer.WriteStartDocument(); 
    writer.WriteComment("Asset hardware Inventory for " + System.Environment.MachineName); 
    writer.WriteStartElement("hardware"); 

上面的代碼甚至不寫的輸出XML文件的開頭的要素,但它確實創造空文件,所以懷疑它有權這樣做。也許閱讀輸入文件是問題?我幾乎不知道本地服務帳戶的工作原理!

+0

所以它實際上寫入文件到磁盤?但它是空的..很奇怪! – iwayneo

+0

猜你已經用WriteEndElement關閉了WriteStartElement,並且在完成後關閉了寫入器。 – Rajesh

+0

我認爲這是創建文件的權利問題。發佈你的代碼的一小部分,也許我們可以幫你 – h1ghfive

回答

0

可能未處理的異常記錄有關該問題的任何細節....

使用Try/Catch,寫入system.diagnostics.trace.writeline的異常,並使用DebugView(http://technet.microsoft.com/en-us/sysinternals/bb896647)讀取輸出。

+0

原來我在閱讀XML時是一個未處理的異常。 – Simon

0

檢查錯誤日誌,在事件查看器,其最可能是你沒有權限來讀取文件C:\

可以使該有權讀取\寫的帳戶下運行服務c:\

您應該使用try並捕獲xml寫入代碼塊,然後記錄錯誤以進一步調試。

+0

我認爲本地服務帳戶將有權限C:(或磁盤的任何部分)?這不是這種情況嗎? – Simon

+0

最有可能不是,我不記得 - 最簡單的方法是打開服務面板並更改服務器正在運行的用戶,並將其更改爲可以讀取和寫入c:\上的文件的帳戶。如果做出這種改變,那麼你肯定知道它的許可問題。長期修復你應該有一個嘗試並捕獲和記錄異常 –

+1

我通常發現編寫服務的最佳方式是將所有的邏輯放到一個類庫中......然後在開發過程中使用帶有控制檯應用程序的類庫。 ..也爲wndows服務使用相同的代碼。示例MyClassLibrary.RunInstance()...這是我需要放在控制檯應用程序和Windows服務中的所有代碼。其餘的代碼是類庫。更容易調試,速度更快,而不是不斷編譯,安裝和卸載服務。 –

0

這是很難不代碼段說,但如果服務沒有啓動,絕對的OnStart拋出異常,放了Thread.Sleep在OnStart方法,重視與Visual Studio處理和debug

0

您是否嘗試過執行你的代碼作爲控制檯應用程序而不是服務?

服務的運行時間問題通常是由於特權造成的。對於寫作部分,這裏不是這種情況,因爲您的代碼需要創建輸出XML文件。因此,您的服務已將權限寫入正確的目錄。

但它可能是它沒有對輸入文件的讀取權限,或者在執行過程中可能會發生異常。

我給你的建議:

  • 測試你的代碼作爲一個控制檯應用程序,而不是一個服務,然後從
  • 的try/catch Visual Studio中進行測試,並記錄任何異常
  • 檢查事件看到觀衆如果Windows與您的服務
+0

是的,代碼作爲控制檯應用程序運行良好。我會在我原來的帖子中發佈代碼。 – Simon

1

我懷疑它沒有沖洗它正在寫入的流。流輸出(包括文件輸出)通常被緩衝,因爲它提供了更好的性能來批量處理一堆字節以寫入文件,而不是一個一個地執行。(這個好處增加了你使用的更大的緩衝區,直到4或8k,這時使用的內存成本大於增益,4和8都比中間的更好,因爲它們也能夠很好地達到內存頁大小,任何情況下,大多數框架提供的流的默認緩衝區都是4k)。

無論如何,如果這是問題,那麼你需要刷新流。這總是在關閉作者時完成的,關閉作者總是在你完成時完成它。作爲一個良好的習慣,你應該儘可能快地處置任何實施IDisposable的事情(如果你不這樣做,總是會認爲有什麼不好的事情發生,即使在你知道給定的Dispose()目前實施爲「否」 -OP)。在大多數情況下,這是最容易using塊做:

using(XmlTextWriter writer = new XmlTextWriter("C:\\hwout.xml", null)) 
{ 
    //code that uses writer here 
} 

即使我的懷疑是錯的,這是非常值得進入這樣的習慣。