2011-08-11 12 views
10

मेरे पास एक विंडोज़ सेवा है जिसे मुझे एक कार्यकर्ता भूमिका के रूप में Azure पर माइग्रेट करने की आवश्यकता है। सब कुछ मेरे Azure समाधान में ठीक बनाता है। हालांकि, जब मैं सबकुछ अपलोड करता हूं तो केवल वेब भूमिका शुरू होती है। कार्यकर्ता भूमिका का उदाहरण निम्नलिखित दो स्थितियों के बीच कभी भी शुरू किए बिना साइकिल चलाता है।एक अज़ूर वर्कर रोल के अंदर चलाने के लिए एक सेवा प्राप्त करना

  • के लिए भूमिका शुरू करने के लिए प्रतीक्षा कर रहा है ...
  • स्थिर भूमिका ...

के बाद से उदाहरण मुझे लगता है मेरी समस्या मेरी WorkerRole.cs कोड में कहीं है शुरू करने के लिए विफल हो रहा है। नीचे आपको वह कोड मिलेगा। यदि यह प्रश्न के लिए प्रासंगिक है तो मैंने सेवा के लिए कोड भी शामिल किया है। मैंने गलत क्या किया?

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Net; 
using System.Threading; 
using Microsoft.WindowsAzure; 
using Microsoft.WindowsAzure.Diagnostics; 
using Microsoft.WindowsAzure.ServiceRuntime; 
using Microsoft.WindowsAzure.StorageClient; 
using System.ServiceProcess; 

namespace SBMWorker 
{ 
public class WorkerRole : RoleEntryPoint 
{ 

    public override void Run() 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new Service1() 
     }; 
     ServiceBase.Run(ServicesToRun); 

     //Thread.Sleep(Timeout.Infinite); 
    } 

} 
} 

यह मेरा Service1.cs कोड है::

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 
using Lesnikowski.Mail; 

namespace SBMWorker 

{ 
public partial class Service1 : ServiceBase 
{ 
    private System.Timers.Timer mainTimer; 

    public Service1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     try 
     { 
      // config the timer interval 
      mainTimer = new System.Timers.Timer(foo.Framework.Configuration.SecondsToWaitBeforeCheckingForEmailsToProcess * 1000); 
      // handling 
      mainTimer.Elapsed += new System.Timers.ElapsedEventHandler(mainTimer_Elapsed); 
      // startup the timer. 
      mainTimer.Start(); 
      // log that we started 
      foo.Framework.Log.Add(foo.Framework.Log.Types.info, "SERVICE STARTED"); 
     } 
     catch (Exception ex) 
     { 
      try 
      { 
       foo.Framework.Log.Add(ex, true); 
      } 
      catch{throw;} 

      // make sure the throw this so the service show as stopped ... we dont want this service just hanging here like 
      // its running, but really just doing nothing at all 
      throw; 
     } 
    } 

    protected override void OnStop() 
    { 
     if (mainTimer != null) 
     { 
      mainTimer.Stop(); 
      mainTimer = null; 
     } 
     // log that we stopped 
     foo.Framework.Log.Add(foo.Framework.Log.Types.info, "SERVICE STOPPED"); 
    } 

    void mainTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     mainTimer.Stop(); 

     bool runCode = true; 

     if (runCode) 
     { 
      try 
      { 
       // call processing 
       foo.Framework.EmailPackageUpdating.ProcessEmails(); 
      } 
      catch(Exception ex) 
      { 
       try 
       { 
        // handle error 
        foo.Framework.Log.Add(ex, false); 
       } 
       catch { throw; } 
      } 
     } 

     mainTimer.Start(); 
    } 
} 
} 
+0

क्यों नहीं तुम सब कुछ चारों ओर आज़माएं/कैच रख दिया और अपवाद लॉग ऑन करते हैं मदद करता है? (मैं आमतौर पर इसे इस तरह से करता हूं: http://blog.smarx.com/posts/printf-here-in-the-cloud।) कोड पढ़ने और अनुमान लगाने की कोशिश करने से डीबग करना बहुत आसान होगा। – smarx

+0

इसके अलावा, क्या यह काम करता है जब आप इसे कंप्यूट एमुलेटर के तहत स्थानीय रूप से चलाते हैं? – smarx

+0

मैंने अभी कार्यकर्ता भूमिका को एक नए समाधान (मेरी वेब भूमिका से अलग) में विभाजित किया है और मुझे एक और विशिष्ट त्रुटि संदेश मिल रहा है। जब मैं इसे स्थानीय रूप से चलाता हूं तो यह कहता है "कमांड लाइन या डीबगर से सेवा शुरू नहीं कर सकता है। विंडोज सर्विस को पहले इंस्टॉल किया जाना चाहिए (installutil.exe का उपयोग करके) और उसके बाद सर्वर एक्सप्लोरर, विंडोज सर्विसेज एडमिनिस्ट्रेशन टूल या नेट स्टार्ट कमांड के साथ शुरू किया जाना चाहिए।" – hughesdan

उत्तर

6

मुझे लगता है कि तुम्हारी समस्या की जड़ यह है कि आप मूल रूप से एक स्थापित नहीं कर सकता है

यह मेरा WorkerRole.cs फ़ाइल है Azure भूमिकाओं में प्रोग्रामेटिक रूप से सेवा। आपको एक .cmd स्टार्टअप स्क्रिप्ट और InstallUtil को सेवा को ठीक से स्थापित करने के लिए उपयोग करने की आवश्यकता है, तो आप इसे स्क्रिप्ट से या अपने कोड से शुरू कर सकते हैं (स्क्रिप्ट से लगता है कि ऑर्डर-ऑफ-निष्पादन कारणों के लिए अक्सर पसंद किया जाता है)। http://blogs.msdn.com/b/golive/archive/2011/02/11/installing-a-windows-service-in-a-worker-role.aspx

यहाँ है एक और ब्लॉग पोस्ट थोड़ा अलग दृष्टिकोण लेता है (कि स्थापना निष्पादित करता है एक नेट ऐप बनाते समय है, लेकिन फिर स्टार्टअप स्क्रिप्ट का हिस्सा है):

यहाँ यह कैसे करना है पर एक ब्लॉग पोस्ट है: http://www.bondigeek.com/blog/2011/03/25/runninginstalling-a-windows-service-in-an-azure-web-role/

आशा है कि

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