Рабочая роль Windows Azure не выходит за пределы первой строки кода

У меня есть рабочая роль, которая отлично работает в разработке, но не работают при развёртывании.«Не работает» довольно расплывчато, но на самом деле это все, что мне нужно, так как я не вижу никаких ошибок или чего-либо еще (в любом случае в журнале событий - может быть, я могу где-то еще поискать). Я добавил в свой код несколько операторов трассировки и вижу, что выходит первый, но ни один из остальных.

Код WorkerRole:

public class WorkerRole : RoleEntryPoint
{
    #region Member variables

    private IWindsorContainer _container;

    private IJob[] _jobs;

    #endregion

    #region Methods

    public override bool OnStart()
    {
        ConfigureDiagnostics();

        Trace.WriteLine("WorkerRole.OnStart()");

        try
        {
            Initialize();

            Trace.WriteLine("Resolving jobs...");
            _jobs = _container.ResolveAll();

            StartJobs();

            return base.OnStart();
        }
        catch (Exception ex)
        {
            TraceUtil.TraceException(ex);
            throw;
        }
        finally
        {
            Trace.WriteLine("WorkerRole.OnStart - Complete");
            Trace.Flush();
        }
    }

    /// 
    /// Sets up diagnostics.
    /// 
    private void ConfigureDiagnostics()
    {
        DiagnosticMonitorConfiguration dmc =
            DiagnosticMonitor.GetDefaultInitialConfiguration();

        dmc.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
        dmc.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;

        DiagnosticMonitor.Start(Constants.DiagnosticsConnectionString, dmc);
    }

    /// 
    /// Sets up the IoC container etc.
    /// 
    private void Initialize()
    {
        Trace.WriteLine("WorkerRole.Initialize()");

        try
        {
            Trace.WriteLine("Configuring AutoMapper...");
            AutoMapperConfiguration.Configure();

            Trace.WriteLine("Configuring Windsor...");
            _container = new WindsorContainer();

            Trace.WriteLine(string.Format("Installing assemblies from directory...{0}", 
                Path.Combine(Environment.GetEnvironmentVariable(Constants.RoleRoot), Constants.AppRoot)));

            _container.Install(FromAssembly.InDirectory(
                new AssemblyFilter(Path.Combine(Environment.GetEnvironmentVariable(Constants.RoleRoot), Constants.AppRoot))));

            Trace.WriteLine(string.Format("Setting the default connection limit..."));
            ServicePointManager.DefaultConnectionLimit = 12;
        }
        finally
        {
            Trace.WriteLine("WorkerRole.Initialize - Complete");
        }
    }

    /// 
    /// Starts all of the jobs.
    /// 
    private void StartJobs()
    {
        Trace.WriteLine("WorkerRole.StartJobs()");

        try
        {
            foreach (IJob job in _jobs)
            {
                job.Start();
            }
        }
        finally
        {
            Trace.WriteLine("WorkerRole.StartJobs - Complete");
        }
    }

    public override void OnStop()
    {
        Trace.WriteLine("WorkerRole.OnStop()");

        try
        {
            foreach (IJob job in _jobs)
            {
                job.Stop();
            }
            _container.Dispose();
        }
        finally
        {
            Trace.WriteLine("WorkerRole.OnStop - Complete");
        }
    }

    #endregion

    #region Private util classes

    public static class AutoMapperConfiguration
    {
        public static void Configure()
        {
            Mapper.Initialize(x => x.AddProfile());
        }
    }

    #endregion
}

Код TraceUtil:

public static class TraceUtil
{
    public static void TraceException(Exception ex)
    {
        StringBuilder buffer = new StringBuilder();

        while (ex != null)
        {
            buffer.AppendFormat("{0} : ", ex.GetType());
            buffer.AppendLine(ex.Message);
            buffer.AppendLine(ex.StackTrace);

            ex = ex.InnerException;
        }
        Trace.TraceError(buffer.ToString());
    }
}

Конфигурация:



  ...
  
    
      
        
          
        
      
    
  

После запуска рабочего, если я смотрю в WADLogsTable, все, что я вижу, это «WorkerRole.OnStart ()» и ничего больше!

Мы будем благодарны за любые идеи относительно того, в чем может быть проблема или как ее устранить.

Обновление: Если я остановлю роль, я также не увижу никаких отладочных операторов из метода OnStop () .

Обновление: Я должен неправильно настроить что-то в моей диагностике. Я думал, что моя отладка выполняется правильно при локальной отладке, но оказалось, что это не так. Я все вижу в окне вывода, но не все в таблице хранения. Я вижу следующие записи в разработке:

WorkerRole.OnStart()
WorkerRole.Initialize()
Configuring AutoMapper...

Я понимаю, что вывод трассировки загружается только периодически, но я ждал около 5 минут, поэтому я думаю, что этого должно быть достаточно, так как у меня он установлен на 1 минуту .

Обновление: Как было предложено @kwill в разделе комментариев, я попытался добавить прослушиватель трассировки файла следующим образом:

  
    
      
        
        
        
      
    
  

Это отлично работает в моей среде разработки и кажется более надежным, так как я получаю все отладить то, что я ожидал. Однако, когда я развертываю его в промежуточном режиме, TextWriterOutput.файл журнала даже не создается!

Мне действительно нужен надежный способ отладки моей рабочей роли, чтобы я мог устранить основную проблему, заключающуюся в том, что мои рабочие места не работают - на данный момент я все еще не понимаю, что они даже пытаются делай так, как я не могу получить отладку!

Обновление: Я почти уверен, что идея отсутствующей библиотеки DLL, предложенная большинством людей, не является проблемой. Чтобы доказать это, я переопределил метод запуска, как показано ниже, и вижу, что отладка «Heartbeat ...» выходит. Мне кажется, что либо функциональность диагностики, либо, по крайней мере, то, как я ее настроил, ненадежны, что не позволяет мне исследовать, почему мои рабочие места не выполняются.

    public override void Run()
    {
        Trace.WriteLine("LearningMiles.JobProcessor.WorkerRole.Run()", "Information");

        try
        {
            while (true)
            {
                Thread.Sleep(10000);
                Trace.WriteLine("Heartbeat...", "Verbose");
            }
        }
        catch (Exception ex)
        {
            TraceUtil.TraceException(ex);
            throw;
        }
        finally
        {
            Trace.WriteLine("LearningMiles.JobProcessor.WorkerRole.Run() - Complete", "Information");
        }
    }

Обновление: Я разместил эту проблему на форуме Windows Azure MSDN .

Обновление: Как было сказано в комментариях, я попытался удалить весь «полезный» код. В процессе разработки это привело к выводу всей отладки. Затем я попытался просто удалить вызов AutomapperConfiguration.Configure () , поскольку раньше я не видел, чтобы после этого вызова ничего не выходило. Это привело к тому, что некоторые операторы трассировки больше не выводились. Однако важно то, что я видел операторы трассировки, которые я вставил в «задания». Поскольку в конечном итоге я хочу разрешить не выполняющиеся задания, я развернул эту версию кода для промежуточной обработки, но там я просто вижу трассировку OnStart () и трассировку «пульса». Я не думаю, что это действительно помогает, но, возможно, это подскажет кому-нибудь некоторые идеи.

10
задан s1mm0t 5 March 2012 в 19:17
поделиться