2012-08-31 25 views
76

त्रुटि को रोक दिया गया, आमतौर पर, मुझे यह त्रुटि मिलती है: (स्थानीय कंप्यूटर पर "सेवा नाम" सेवा शुरू हो गई और फिर बंद कर दिया गया। कुछ सेवाएं स्वचालित रूप से बंद हो जाती हैं अगर वे अन्य सेवा द्वारा उपयोग में नहीं हैं या कार्यक्रम) जब मेरे कोड में कुछ गड़बड़ है, जैसे गैर-मौजूदा ड्राइव पथ आदि। विंडोज सेवा शुरू नहीं होगी।स्थानीय कंप्यूटर पर विंडोज सेवा शुरू हुई और फिर

मेरे पास एक विंडो सेवा है जो फ़ोल्डर/फ़ाइलों का बैक अप लेती है, यदि यह आकार सीमा तक पहुंच जाती है। विवरण सभी एक एक्सएमएल कॉन्फ़िगरेशन द्वारा प्रदान किए जाते हैं जो विंडोज सेवा प्रारंभ पर पढ़ता है। मेरे पास एक अलग विंडोज़ फॉर्म हैं जिनमें एक बटन है जो वास्तव में मेरी विंडोज़ सेवा ऑनस्टार्ट कर रहा है। मैं अपनी विंडोज़ सेवा में रखे जाने से पहले कोड को डिबग करने के लिए अपने विंडोज़ फॉर्म का उपयोग करता हूं।

जब मैं अपने विंडोज़ फॉर्म शुरू करता हूं। ऐसा लगता है कि ऐसा करना है। जब मैं अपना कोड विंडोज सेवा ऑनस्टार्ट() विधि में डालता हूं तो त्रुटि दिखाई देती है।

यहाँ मेरी कोड है:

protected override void OnStart(string[] args) 
{ 

    private static string backupConfig = @"D:\LogBackupConfig\backupconfig.xml"; 
    private static string serviceStat = @"D:\LogBackupConfig\Status.txt"; 
    private static string fileFolderStat = @"D:\LogBackupConfig\FileFolderStat.txt"; 

    protected override void OnStart(string[] args) 
    { 
     if (File.Exists(backupConfig)) 
     { 
      FileSystemWatcher watcher = new FileSystemWatcher(); 
      XmlTextReader reader = new XmlTextReader(backupConfig); 

      XmlNodeType type; 
      List<string> listFile = new List<string>(); 
      string fileWatch = ""; 

      //this loop is for reading XML elements and assigning to variables 
      while (reader.Read()) 
      { 
       type = reader.NodeType; 
       if (type == XmlNodeType.Element) 
       { 
        if (reader.Name == "File") 
        { 
         reader.Read(); 
         fileWatch = reader.Value; 
        } 
        else if (reader.Name == "Folder") 
        { 
         reader.Read(); 
         fileWatch = reader.Value; 
        } 
       } 
      } 
      reader.Close(); 

      watcher.Path = fileWatch; 
      watcher.Filter = "*.*"; 

      //this loop reads whether the service will watch a file/folder 
      XmlTextReader reader1 = new XmlTextReader(backupConfig); 
      while (reader1.Read()) 
      { 
       type = reader1.NodeType; 
       if (type == XmlNodeType.Element) 
       { 
        if (reader1.Name == "File") 
        { 
         watcher.IncludeSubdirectories = false; 
         watcher.Changed += new FileSystemEventHandler(OnChangedFile); 
        } 
        else if (reader1.Name == "Folder") 
        { 
         watcher.IncludeSubdirectories = true; 
         watcher.Changed += new FileSystemEventHandler(OnChangedFolder); 
        } 
       } 
      } 
      reader1.Close(); 

      watcher.EnableRaisingEvents = true; 

     } 
     else 
     { 
      StreamWriter sw = new StreamWriter(serviceStat, true); 
      sw.WriteLine("File not found. Please start the Log Backup UI first."); 
      sw.Close(); 
     } 
    } 

मैं क्या रहता है खिड़कियों सेवा शुरू नहीं पता नहीं है, खिड़कियों प्रपत्र सिम्युलेटर ठीक काम किया। आखिर समस्या क्या लग रही है?

अद्यतन: कई परीक्षणों के बाद मैंने देखा है कि केवल एक फ़ोल्डर निर्देशिका (डब्ल्यू/आउट फ़ाइल) का उपयोग करके, विंडोज सेवा काम नहीं करती है। जब मैंने फ़ाइल वैच वैरिएबल को एक विशिष्ट फ़ाइल (इसकी निर्देशिका सहित) के साथ बदल दिया, तो विंडोज़ सेवा शुरू हुई। जब मैंने इसे किसी फ़ोल्डर स्थान पर बदल दिया, तो यह काम नहीं किया। मुझे लगता है कि फ़ोल्डर स्थान फ़ाइलवॉचर में काम नहीं करता है।

जब मैंने एक नई विंडो सेवा बनाने की कोशिश की जो फ़ोल्डर स्थान देखता है, तो यह काम करता है .. हालांकि, जब मैंने अपनी मूल विंडोज सेवा में एक ही स्थान की कोशिश की, तो यह काम नहीं किया! मैं दिमाग $ # ​​* एड था! ऐसा लगता है कि मुझे एक नई विंडोज सेवा बनाना है और हर बार जब मैं एक नया कोड/फ़ंक्शन डालता हूं तो इंस्टॉलर का निर्माण करना होता है .. इस तरह मैं ट्रैक रख सकता हूं जहां मुझे कोई त्रुटि मिलती है।

उत्तर

156

यदि सेवा शुरू होती है और उस तरह रुक जाती है, तो इसका मतलब है कि आपका कोड एक अनचाहे अपवाद फेंक रहा है। डीबग करना बहुत मुश्किल है, लेकिन कुछ विकल्प हैं।

  1. विंडोज इवेंट व्यूअर से परामर्श लें। आम तौर पर आप कंप्यूटर/सर्वर मैनेजर पर जाकर, इवेंट व्यूअर ->विंडोज लॉग ->एप्लिकेशन पर क्लिक करके प्राप्त कर सकते हैं। आप देख सकते हैं कि अपवाद किसने फेंक दिया, जो मदद कर सकता है, लेकिन आपको स्टैक ट्रेस नहीं मिलता है।
  2. लाइब्रेरी क्लास प्रोजेक्ट में अपने प्रोग्राम तर्क को निकालें। अब प्रोग्राम के दो अलग-अलग संस्करण बनाएं: एक कंसोल ऐप (डीबगिंग के लिए), और विंडोज़ सेवा। (यह प्रारंभिक प्रयास का एक छोटा सा प्रयास है, लेकिन लंबे समय तक बहुत अधिक एंजस्ट बचाता है।)
  3. और अधिक प्रयास करें/पकड़ें ब्लॉक और ऐप पर लॉग इन करना क्या हो रहा है इसकी बेहतर तस्वीर प्राप्त करने के लिए।
+5

आपको बहुत बहुत धन्यवाद! मैंने कोशिश की और यह त्रुटि है: "सेवा शुरू नहीं की जा सकती है। सिस्टम। ऑर्ग्यूमेंट अपवाद: पथ कानूनी रूप से नहीं है। System.IO.Path.NormalizePath (स्ट्रिंग पथ, बूलियन फुल चेक, Int32 maxPathLength) सिस्टम पर IO.Path.GetFullPathInternal (स्ट्रिंग पथ) System.IO.Path पर।GetFullPath (स्ट्रिंग पथ) System.IO.FileSystemWatcher.StartRaisingEvents पर () System.IO.FileSystemWatcher.set_EnableRaisingEvents पर (बूलियन वैल्यू) LogBackupWinSvc.Service1.OnStart पर (String [] args) System.ServiceProcess.ServiceBase पर । ServiceQueuedMainCallback (ऑब्जेक्ट स्टेट) " – Blackator

+3

विंडोज इवेंट व्यूअर ने पूरा स्टैक ट्रेस दिखाया, बहुत उपयोगी टूल। –

0

टाइमर का उपयोग करें और अपनी फ़ाइलों की प्रतिलिपि बनाने के लिए ईवेंट का निशान लगाएं।

सेवा शुरू करने पर, समय शुरू करें और उस समय अंतराल निर्दिष्ट करें।

तो सेवा चल रही है और फ़ाइलों को प्रतिलिपि बना रही है।

उम्मीद है कि यह मदद करेगा।

0

आप इकाई को प्रारंभिक परीक्षण करना चाहते हैं - लेकिन क्योंकि यह OnStart विधि में है, यह असंभव के करीब है। मैं प्रारंभिक कोड को एक अलग वर्ग में ले जाने का सुझाव दूंगा ताकि इसका परीक्षण किया जा सके या कम से कम एक फॉर्म परीक्षक में फिर से उपयोग किया जा सके।

दूसरा लॉगिंग जोड़ने के लिए दूसरा (Log4Net या इसी तरह का उपयोग करके) और कुछ वर्बोज़ लॉगिंग जोड़ें ताकि आप रनटाइम त्रुटियों के बारे में विवरण देख सकें। रनटाइम त्रुटियों के उदाहरण AccessViolation आदि होंगे, विशेष रूप से यदि आपकी सेवा कॉन्फ़िगरेशन फ़ाइलों तक पहुंचने के लिए पर्याप्त विशेषाधिकारों के बिना चल रही है।

28

सुनिश्चित नहीं हैं कि यह उपयोगी होगा, लेकिन एक सेवा डीबगिंग के लिए आप हमेशा onStart विधि में निम्नलिखित इस्तेमाल कर सकते हैं:

protected override void OnStart(string[] args) 
{ 
    System.Diagnostics.Debugger.Launch(); 
    ... 
} 

से आप इस प्रक्रिया को करने के लिए अपने दृश्य स्टूडियो देते हैं और बेहतर डिबग क्षमताओं हो सकता था।

आशा है कि यह मददगार था, सौभाग्य

+0

यह डीबग के लिए बहुत अच्छा समाधान है, धन्यवाद –

+0

यह अब तक का सबसे अच्छा समाधान है (कम से कम मेरे लिए)। वीएस 2015 इस अच्छी तरह से संभालता है ठीक है। मेरे लिए यह जेआईटी डीबगर के लिए एक यूएसी पुष्टिकरण संवाद पॉप अप करता है और फिर मुझे डीएसयू 2015 को डीबगर के रूप में चुनने देता है। – Smitty

0

खाता है जो सेवा चल रही है डी मैप किया गया है नहीं हो सकता है: -ड्राइव (वे उपयोगकर्ता के लिए विशिष्ट हैं)। निर्देशिका साझा करने का प्रयास करें, और अपने backupConfig में पूर्ण यूएनसी-पथ का उपयोग करें।

आपका प्रकार FileSystemWatcher की watcher एक स्थानीय चर रहा है, और जब OnStart विधि से किया जाता है दायरे से बाहर है। आपको शायद इसे एक उदाहरण या कक्षा चर के रूप में चाहिए।

8

मुझे यह बहुत एक कंसोल के लिए अपने मौजूदा खिड़कियों सेवा कन्वर्ट करने के लिए काम मिल गया है निम्नलिखित के साथ अपने प्रोग्राम को बदलकर। इस परिवर्तन के साथ आप विजुअल स्टूडियो में डीबगिंग या सामान्य रूप से निष्पादन योग्य चलकर प्रोग्राम चला सकते हैं। लेकिन यह विंडोज़ सेवा के रूप में भी काम करेगा। I also made a blog post about it

Program.cs

class Program 
{ 
    static void Main() 
    { 
     var program = new YOUR_PROGRAM(); 
     if (Environment.UserInteractive) 
     { 
      program.Start(); 
     } 
     else 
     { 
      ServiceBase.Run(new ServiceBase[] 
      { 
       program 
      }); 
     } 
    } 
} 

YOUR_PROGRAM.cs

[RunInstallerAttribute(true)] 
public class YOUR_PROGRAM : ServiceBase 
{ 
    public YOUR_PROGRAM() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     Start(); 
    } 

    protected override void OnStop() 
    { 
     //Stop Logic Here 
    } 

    public void Start() 
    { 
     //Start Logic here 
    } 
} 
+2

बस एफवाईआई, ब्लॉग काम नहीं करता है। –

0

मैं एक ही मुद्दा बारे में जाना। मेरी सेवा एक्सएमएलएस अपलोड/प्राप्त कर रही है और इवेंट लॉग में त्रुटियां लिख रही है।

जब मैं इवेंट लॉग में गया, तो मैंने इसे फ़िल्टर करने का प्रयास किया। यह मुझे संकेत देता है कि इवेंट लॉग दूषित हो गया था।

मैंने इवेंट लॉग और सभी ठीक कर दिया।

1

EventLog.Log को "एप्लिकेशन" के रूप में सेट किया जाना चाहिए

+0

मैं बस ऊपर उठ गया क्योंकि यह वास्तव में समस्या का समाधान था मुझे – Savage

संबंधित मुद्दे