У меня есть рабочая роль, которая отлично работает в разработке, но не работает при развертывании. "Не работает" довольно расплывчато, но на самом деле все, что я должен продолжать, поскольку я не вижу никаких ошибок или чего-либо еще (в любом случае журнал событий - возможно, где-то еще я могу посмотреть). Я добавил некоторые инструкции к моему коду, и я вижу, что первый вышел, но никто из других.
Код 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<IJob>();
StartJobs();
return base.OnStart();
}
catch (Exception ex)
{
TraceUtil.TraceException(ex);
throw;
}
finally
{
Trace.WriteLine("WorkerRole.OnStart - Complete");
Trace.Flush();
}
}
/// <summary>
/// Sets up diagnostics.
/// </summary>
private void ConfigureDiagnostics()
{
DiagnosticMonitorConfiguration dmc =
DiagnosticMonitor.GetDefaultInitialConfiguration();
dmc.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
dmc.Logs.ScheduledTransferLogLevelFilter = LogLevel.Verbose;
DiagnosticMonitor.Start(Constants.DiagnosticsConnectionString, dmc);
}
/// <summary>
/// Sets up the IoC container etc.
/// </summary>
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");
}
}
/// <summary>
/// Starts all of the jobs.
/// </summary>
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<ModelProfile>());
}
}
#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());
}
}
Config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
...
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="AzureDiagnostics">
<filter type="" />
</add>
</listeners>
</trace>
</system.diagnostics>
</configuration>
Как только рабочий запустится, если я посмотрю в WADLogsTable, все, что я вижу, это "WorkerRole.OnStart()", и больше ничего!
Любые идеи о том, что может быть проблемой или как устранить эту проблему, будут оценены.
Обновление: Если я остановлю роль, я не вижу ни одного из операторов отладки метода OnStop()
.
Обновление: У меня должно быть что-то неправильное с моей диагностикой. Я думал, что вижу, что моя отладка вышла правильно, когда отлаживается локально, но оказывается, что нет. Я вижу все в окне вывода, но я не вижу всего в таблице хранения. В разработке я вижу следующие записи:
WorkerRole.OnStart()
WorkerRole.Initialize()
Configuring AutoMapper...
Я понимаю, что вывод трассировки только периодически загружается, но я ждал 5 минут или около того, поэтому я думаю, что это должно быть достаточно долго, так как я установил его на 1 минуту.
Обновление: Как было предложено @kwill в разделе комментариев, я попытался добавить прослушиватель трассировки файла следующим образом:
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="AzureDiagnostics">
</add>
<add name="File" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\TextWriterOutput.log" />
</listeners>
</trace>
</system.diagnostics>
Это прекрасно работает в моей среде разработки и кажется более надежным, а также я получаю всю отладочную информацию, которую я ожидал бы. Однако, когда я развертываю его для создания, файл TextWriterOutput.log даже не создан!
Мне действительно нужен надежный способ получить отладку из моей рабочей роли, чтобы я мог устранить конечную проблему, которая заключается в том, что мои рабочие места не работают - на данный момент я до сих пор не знаю, что они даже пытаются сделайте так, как я не могу получить отладки!
Обновление: Я уверен, что недостающая идея dll, предложенная большинством людей, не проблема. Чтобы, надеюсь, доказать это, я переопределил метод run, как показано ниже, и я вижу, что отладка "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() и трассировку "сердцебиение". Я не думаю, что это действительно помогает, но, возможно, это даст кому-то некоторые идеи.