2010-08-10 8 views
7

मैं विंडोज प्लेटफार्मों पर .NET का उपयोग कर एक सेवा विकसित कर रहा हूं।सेवा नियंत्रण फ़ंक्शन का जवाब नहीं दे रही है (त्रुटि 2186)

यह कल तक काम करता था ... लेकिन आज यह शुरू नहीं करना चाहता !!! यह अजीब लगता है, और मुझे लगता है कि मैं कुछ याद कर रहा हूँ महसूस ...

मैं भी अंतिम कार्य संस्करण के लिए सूत्रों का कहना है वापस लौटने की कोशिश की है, लेकिन कुछ नहीं होता है: शुद्ध शुरू आउटपुट:

सेवा नियंत्रण समारोह का जवाब नहीं दे रही है।

इस खराबी का कारण क्या हो सकता है?


शायद आप में से अधिकांश इसके बारे में और जानना चाहते हैं। तो, मैं आपको कुछ कोड दिखाते हैं:

सेवा कोड:

#if DEBUG 
class iGeckoService : DebuggableService 
#else 
class iGeckoService : ServiceBase 
#endif 
{ 
    static void Main() 
    { 
#if DEBUG 
     if (Debugger.IsAttached == true) { 
      DebuggableService[] services = Services; 

      // Create console 
      AllocConsole(); 

      // Emulate ServiceBase.Run 
      foreach (DebuggableService service in services) 
       service.Start(null); 

      // Wait for new line 
      Console.WriteLine("Press ENTER to exit..."); Console.ReadLine(); 

      // Emulate ServiceBase.Run 
      foreach (DebuggableService service in services) 
       service.Stop(); 
     } else 
      ServiceBase.Run(Services); 
#else 
     ServiceBase.Run(Services); 
#endif 
    } 

#if DEBUG 

    static DebuggableService[] Services 
    { 
     get { 
      return (new DebuggableService[] { new iGeckoService() }); 
     } 
    } 

    [DllImport("kernel32")] 
    static extern bool AllocConsole(); 

#else 

    static DebuggableService[] Services 
    { 
     get { 
      return (new ServiceBase[] { new iGeckoService() }); 
     } 
    } 

#endif 

    #endregion 

    #region Constructors 

    /// <summary> 
    /// Default constructor. 
    /// </summary> 
    public iGeckoService() 
    { 
     // Base properties 
     ServiceName = DefaultServiceName; 

     // Service feature - Power events 
    } 

    #endregion 

    protected override void OnStart(string[] args) 
    { 
     try { 
      ... 

     } catch (Exception e) { 
      sLog.Error("Unable to initialize the service. Request to stop.", e); 
     } 
    } 

    /// <summary> 
    /// Stop this service. 
    /// </summary> 
    protected override void OnStop() 
      { 
        ... 
      } 
    } 

    [RunInstaller(true)] 
public class iGeckoDaemonInstaller : Installer 
{ 
    /// <summary> 
    /// Default constructor. 
    /// </summary> 
    public iGeckoDaemonInstaller() 
    { 
     ServiceProcessInstaller spi = new ServiceProcessInstaller(); 
     spi.Account = ServiceAccount.LocalSystem; 

     ServiceInstaller si = new ServiceInstaller(); 
     si.ServiceName = iGeckoService.DefaultServiceName; 
     si.StartType = ServiceStartMode.Automatic; 

     Installers.AddRange(new Installer[] {spi, si}); 
    } 
} 

class DebuggableService : ServiceBase 
{ 
    public void Start(string[] args) { OnStart(args); } 
} 

शुरू स्क्रिप्ट है:

installutil ..\bin\Debug\iGeckoService.exe 
net start "Gecko Videowall" 

जबकि बंद स्क्रिप्ट है:

net stop "Gecko Videowall" 
installutil /u ..\bin\Debug\iGeckoService.exe 

हालांकि, मुझे लगता है कि यह एक सिस्टम सेटिंग है, क्योंकि टी वह आवेदन पिछले दिन तक अच्छी तरह से काम किया है। (साँस)।


अद्यतन

जब सेवा काम कर रहा था, मैं लॉगिंग सेवा गतिविधि (मैं चल रहा है सेवा करने के लिए डिबगर संलग्न करने में असमर्थ हूँ ...), और यह हमेशा के लिए लॉग इन किया है log4net इस्तेमाल किया ।

अब से, लॉग 4नेट लॉग यह कभी नहीं बनाया गया है (भले ही मैं आंतरिक डीबग विकल्प सक्षम करता हूं), भले ही मैं मुख्य दिनचर्या पर लॉग इन करता हूं!


कोई अन्य अपडेट

ऐसा लगता है कि आवेदन निष्पादित कभी नहीं किया गया है। मैंने हर दिनचर्या (मुख्य, ऑनस्टार्ट, ऑनस्टॉप) को कम कर दिया है, और मैं एक खाली सेवा चलाता हूं। ऑनस्टार्ट दिनचर्या एक निर्देशिका पर एक फ़ाइल बनाता है (सभी द्वारा पूरी तरह से लिखने योग्य), लेकिन जब सेवा शुरू हो जाती है, तो कोई फ़ाइल नहीं बनाई जाती है।


फिर भी एक और अद्यतन

रोब की टिप्पणी से प्रेरित, मैं घटना दर्शक पर इस संदेश को देखा है:

> Faulting application name: iGeckoService.exe, version: 1.0.0.0, time stamp: 0x4c60de6a 
> Faulting module name: ntdll.dll, version: 6.1.7600.16385, time stamp: 0x4a5be02b 
> Exception code: 0x80000003 
> Fault offset: 0x000000000004f190 
> Faulting process id: 0x1258 
> Faulting application start time: 0x01cb384a726c7167 
> Faulting application path: C:\Users\Luca\Documents\Projects\iGeckoSvn\iGeckoService\bin\Debug\iGeckoService.exe 
> Faulting module path: C:\Windows\SYSTEM32\ntdll.dll 
> Report Id: b096a237-a43d-11df-afc4-001e8c414537 

यह, निश्चित, सेवा पर कारण है शटडाउन ... सवाल नहीं बनता है: "इसे कैसे डिबग करें?" (धन्यवाद रॉब, मैंने कभी भी ईवेंट व्यूअर के बारे में कभी सोचा नहीं है!) इसे कंसोल एप्लिकेशन के रूप में चलाने में डिबग करना यह कोई त्रुटि नहीं दिखाता है, वास्तव में यह सेवा वातावरण से संबंधित प्रतीत होता है। मेरे दिमाग में आने वाली एकमात्र चीज कुछ डीएलएल लोडिंग विफलता हो सकती है, क्योंकि अब सेवा खाली है ... कोई विचार?


हल (आप सभी मेरा पीछा करने के लिए धन्यवाद ... मैं आप पिज्जा & बियर पेशकश करना चाहते हैं)!

सेवा एमएस एप्लीकेशन सत्यापनकर्ता (x64) की स्थापना और सेटअप के कारण मुख्य दिनचर्या से पहले दुर्घटना के बाद से शुरू करने में असमर्थ थी। उस एप्लिकेशन को अनइंस्टॉल करने के बाद, सबकुछ सामान्य रूप से काम करता था!

सभी को धन्यवाद!

+0

क्या आप अपनी सेवा निष्पादित करने का प्रयास करते समय ईवेंट लॉग में लॉग इन हैं? – Rob

+0

हां। स्टार्टअप पर सेवा दुर्घटना। अभी भी सोच रहा है कि क्यों, प्रत्येक कार्य संस्करण वर्णित के रूप में दुर्घटनाग्रस्त है। – Luca

उत्तर

4

सामान्य तौर पर हर सेवा दो साधारण चीजें

  • निम्न कार्य करना होगा अगर सेवा प्रबंधक उसे SERVICE_CONTROL_START, SERVICE_CONTROL_STOP की तरह एक नियंत्रण कोड भेज सकते हैं और इतने पर है, तो वापस आ जाएगी एक छोटे अंतराल में। SetServiceStatus फ़ंक्शन सेवा का उपयोग इस अंतराल को बढ़ा सकता है उदाहरण के लिए SetServiceStatus को dwCheckPoint मान के साथ कॉल करने के साथ। (.NET उपयोग में ServiceBase.RequestAdditionalTime का उपयोग कर सकते हैं)
  • प्रत्येक सेवा को बदले में SERVICE_CONTROL_INTERROGATE नियंत्रण कोड का उत्तर देना होगा। यह नियंत्रण कोड सेवा प्रबंधक से यह पता लगाने के लिए उपयोग किया जाता है कि सेवा अभी भी रह रही है या नहीं।

यदि आपका प्रोग्राम नियमों में से किसी एक का पालन नहीं करता है तो आपको त्रुटि मिलती है "सेवा नियंत्रण कार्य का जवाब नहीं दे रही है।"

यदि आप .NET में कोई प्रोग्राम लिखते हैं तो आपको पहले दो वर्णों को सीधे करने की आवश्यकता नहीं है। ServiceBase कक्षा आपके लिए वहां है।फिर भी सामान्य रूप से सामान्य के रूप में प्राथमिकता के साथ चलने वाले धागे को बनाने के लिए यदि आप ServiceBase.RequestAdditionalTime पर कॉल किए बिना ऑनऑक्स हैंडल (OnStop, OnStart, OnPowerEvent आदि) के अंदर कुछ बहुत लंबा काम करते हैं तो आप इन नियमों को आसानी से तोड़ सकते हैं। अतिरिक्त धागे के साथ कुछ अन्य चाल भी समस्याएं पैदा कर सकती हैं।

+0

जानकारी के लिए धन्यवाद, लेकिन इससे मदद नहीं मिलती है। मैंने ऑनस्टार्ट और ऑनस्टॉप रूटीन पर टिप्पणी की है (अब उनके पास खाली कार्यान्वयन है) और व्यवहार यह वही है। – Luca

+0

बस अपने आवेदन के लिए एक नई परियोजना बनाने का प्रयास करें, .NET इंस्टॉलर और सराय जोड़ें। Http://msdn.microsoft.com/en-us/library/zt39148a.aspx से चरणों का पालन करें। एक नई टेस्ट सेवा सफल होने के बाद नई परियोजना में छोटे चरणों में अपना पुराना कोड शामिल होगा। इस विधि को काम करना चाहिए। – Oleg

+0

मैं सहमत हूं, मैंने वही किया। मुझे इस अजीब व्यवहार से नफरत है। – Luca

3

आमतौर पर ऐसा होता है यदि आप OnStart कॉल में बहुत अधिक काम करने की कोशिश कर रहे हैं। उदाहरण के लिए, यदि आप एक ही थ्रेड में एक अंतहीन पाश शुरू करते हैं, तो आपको यह त्रुटि संदेश मिल जाएगा।

आम तौर पर सेवा OnStart कॉल में एक नया धागा बनाना चाहिए, और फिर इसे OnStop कॉल में साफ़ रूप से समाप्त कर दें।

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

+0

हाँ। मैंने रीबूट करने की कोशिश की, और मैंने नियमित रूप से ऑनस्टार्ट और ऑनस्टॉप में हर पंक्ति पर टिप्पणी की है ... लेकिन यह काम नहीं किया है। – Luca

0

मैं देख रहा हूँ एक कोड ब्लॉक

// Wait for new line 
      Console.WriteLine("Press ENTER to exit..."); Console.ReadLine(); 

है कि वहाँ के रूप में @Jon द्वारा कहा गया के बाद से इस एक सेवा है। जब सेवा शुरू होती है तो यह निर्धारित समय के लिए प्रतीक्षा करता है जिसके भीतर उसे जवाब देना चाहिए।

एक कथन है "Console.ReadLine()" आप सेवा दबाए जाने तक प्रतीक्षा करेंगे। के बाद से यह एक सेवा इस बिंदु पर इंतज़ार कर रखेंगे है

+0

असल में कोड केवल तभी निष्पादित किया जाता है जब मैं डीबगर का उपयोग कर एप्लिकेशन शुरू करता हूं। ऐसा तब नहीं होता जब मैं कमांड लाइन से सेवा शुरू करता हूं। मैंने DEBUG प्रीप्रोसेसर प्रतीक परिभाषित किए बिना एप्लिकेशन चलाने की भी कोशिश की है, और यह वही व्यवहार है। – Luca

+0

क्या आपके प्रोजेक्ट गुणों में आपका मतलब है कि आपने DEBUG निरंतर विकल्प को परिभाषित किया है? रिलीज मोड में समाधान बनाने का प्रयास करें और फिर इसे रिलीज फ़ोल्डर से इंस्टॉल करें। –

+0

हां, मेरे पास रिलीज कॉन्फ़िगरेशन है जो DEBUG प्रीप्रोसेसर प्रतीक को परिभाषित नहीं करता है। – Luca

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

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