无法启动Azure Worker角色,异常代码0xe043352&;0xC0000035
本文关键字:0xe043352 代码 amp 0xC0000035 异常 启动 Azure Worker 角色 | 更新日期: 2023-09-27 18:21:46
在模拟器中本地运行时,web工作程序工作正常。然而,每当我更新在Azure VM上运行的web工作程序时,我都会在事件查看器中获得以下异常,并且角色不会启动:
应用程序:WaWorkerHost.exe
框架版本:v4.0.30319
描述:由于出现未处理的异常,进程已终止
异常信息:System.AggregateException
堆栈:位于System.Threading.Tasks.Task.Wait(Int32,System.Threading.CancellationToken)位于System.Threading.Tasks.Task.Wet()
在Foo.PushProcess.WorkerRole.Run()
位于Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.StartRoleInternal()位于Microsoft.WindowsAzure.ServiceRuntime.Elementation.Loader.RoleRuntimeBridge.b_2()位于System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext、System.Threading.ContextCallback、System.Object、Boolean)
位于System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext、System.Threading.ContextCallback、System.Object、Boolean)
位于System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext、System.Threading.ContextCallback、System.Object)
位于System.Threading.ThreadHelper.ThreadStart()内部异常:任务已取消。
出现故障的应用程序名称:WaWorkerHost.exe,版本:2.6.1198.712,时间戳:0x54eba731
故障模块名称:KERNELBASE.dll,版本:6.3.9600.17415,时间戳:0x54505737
异常代码:0xe0434352
故障偏移量:0x0000000000008b9c
出现故障的进程id:0xfb8
出现故障的应用程序启动时间:0x01d11e3128981a5d
出现故障的应用程序路径:E:''base''x64''WaWorkerHost.exe
出现故障的模块路径:D:''Windows''system32''KERNELBASE.dll
报告Id:30631c5c-8a25-11e5-8066-0000d3a22f3ec
出现故障的程序包全名:
出现故障的程序包相关应用程序ID:
会话"MA_ETWSESSION_WAD_415df88f8a0447178dbd4c18f1349f0e_Foo.PushProcess_Foo.PushProcess_IN_0"未能启动,出现以下错误:0xC0000035
这是相关代码:
public override void Run()
{
Trace.TraceInformation("Foo.PushProcess is running");
try
{
RunAsync(_cancellationTokenSource.Token).Wait(); // This is where the exceptions point to
}
catch (Exception ex)
{
Trace.TraceError("[WORKER] Run error: " + ex);
}
finally
{
_runCompleteEvent.Set();
}
}
public override bool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
bool result = base.OnStart();
_storageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));
var queueClient = _storageAccount.CreateCloudQueueClient();
_pushQueue = queueClient.GetQueueReference("pushes");
_pushQueue.CreateIfNotExists();
CreatePushBroker();
Trace.TraceInformation("Foo.PushProcess has been started");
return result;
}
private async Task RunAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
Trace.TraceInformation("Working");
CloudQueueMessage message = null;
try
{
message = _pushQueue.GetMessage();
if (message != null)
{
ProcessItem(message);
}
}
catch (Exception ex)
{
if (message != null && message.DequeueCount > 5)
_pushQueue.DeleteMessage(message);
Trace.TraceError("[WORKER] Retrieval Failure: " + ex);
}
await Task.Delay(1000, cancellationToken);
}
}
请注意,有些代码被省略了,但这些代码都是在初始化后运行的,理论上这个异常不会到达。
我完全不知道是什么原因导致了这个问题。任何帮助都将不胜感激——即使只是为了帮助我获得一个有用的例外。
更新
我现在已经把我的代码简化到下面——这是一个网络工作者可能做到的最简单的事情——我仍然会遇到异常。我认为,要么是旧的工作进程正在被缓存,要么是部署过程中出现了问题。
public override void Run()
{
Trace.TraceInformation("Foo.PushProcess is running");
try
{
RunAsync(_cancellationTokenSource.Token).Wait(); // This is where the exceptions point to
}
catch (Exception ex)
{
Trace.TraceError("[WORKER] Run error: " + ex);
}
finally
{
_runCompleteEvent.Set();
}
}
public override bool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
bool result = base.OnStart();
return result;
}
private async Task RunAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
Trace.TraceInformation("Working");
// code removed for testing - no work is being done.
await Task.Delay(1000, cancellationToken);
}
}
我试了一下,没能让它在我的一端重新编译。我有VS 2015 Enterprise(14.0.23107.0 D14REL),它来自我部署的MSDN Azure映像,运行.Net Fx 4.6版。我安装了Azure Tools和SDK 2.8。我使用.NET Fx 4.5.2创建了一个新的Azure云服务,并添加了一个工作角色。
我刚刚运行了一些稀疏代码模板,如下所示:
public class WorkerRole : RoleEntryPoint
{
private readonly CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
private readonly ManualResetEvent runCompleteEvent = new ManualResetEvent(false);
private CloudQueue _pushQueue;
private CloudStorageAccount _storageAccount;
public override void Run()
{
Trace.TraceInformation("WorkerRole1 is running");
try
{
this.RunAsync(this.cancellationTokenSource.Token).Wait();
}
catch (Exception ex)
{
Trace.TraceError("[WORKER] Run error: " + ex);
}
finally
{
this.runCompleteEvent.Set();
}
}
public override bool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
bool result = base.OnStart();
_storageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));
var queueClient = _storageAccount.CreateCloudQueueClient();
_pushQueue = queueClient.GetQueueReference("pushes");
_pushQueue.CreateIfNotExists();
CreatePushBroker();
Trace.TraceInformation("Foo.PushProcess has been started");
return result;
}
private void CreatePushBroker()
{
return;
}
public override void OnStop()
{
Trace.TraceInformation("WorkerRole1 is stopping");
this.cancellationTokenSource.Cancel();
this.runCompleteEvent.WaitOne();
base.OnStop();
Trace.TraceInformation("WorkerRole1 has stopped");
}
private async Task RunAsync(CancellationToken cancellationToken)
{
// TODO: Replace the following with your own logic.
while (!cancellationToken.IsCancellationRequested)
{
Trace.TraceInformation("Working");
CloudQueueMessage message = null;
try
{
message = _pushQueue.GetMessage();
if (message != null)
{
ProcessItem(message);
}
}
catch (Exception ex)
{
if (message != null && message.DequeueCount > 5)
_pushQueue.DeleteMessage(message);
Trace.TraceError("[WORKER] Retrieval Failure: " + ex);
}
await Task.Delay(1000, cancellationToken);
}
}
private void ProcessItem(CloudQueueMessage message)
{
return;
}
}
}
它在本地模拟器中运行时没有问题,我继续将它部署到美国西部,并在一个小型实例VM上启用了IntelliTrace,但有n个部署问题。它运行在WA-GUEST-OS-4.26_201511-0访客工人角色映像上,我能够RDP到机器中,我没有看到任何与代码或机器有关的问题。您是否有任何其他二进制文件可能没有包含在包中,或者可能存在一些未正确定义的依赖项,或者存储帐户命名问题?
这是我的部署日志。正如你所看到的,它花了大约7分钟,因为我让它从美国东部提取存储只是为了好玩:
凌晨1:11:25-警告:存在包验证警告。凌晨1:11:26-正在检查远程桌面证书。。。上午1:11:26-正在上传证书。。。上午1:11:42-应用诊断扩展。1:12:24 AM-准备AzureCloudService1的部署-2015年11月24日1:11:19 AM,订阅ID为"9a4715f5-acab8-4a18-8259-1c28b92XXXXX",使用服务管理URLhttps://management.core.windows.net/'。。。凌晨1:12:24-正在连接。。。凌晨1:12:24-正在验证存储帐户"ericgolestus"。。。凌晨1:12:24-正在上传包。。。凌晨1:12:28-正在创建。。。凌晨1:13:15-已创建部署ID:c5f26568707b46a3bd42466dd0bf7509。凌晨1:13:15-WorkerRole1角色的实例0正在创建虚拟机凌晨1:13:15-开始。。。凌晨1:13:32-正在初始化。。。凌晨1:14:36-WorkerRole1角色的实例0正在启动虚拟机凌晨1:16:11-WorkerRole1角色的实例0处于未知状态凌晨1:16:43-WorkerRole1角色的实例0正忙详细信息:正在启动角色。。。系统正在初始化。〔2015-11-2401:16:08Z〕上午1:19:50-WorkerRole1角色的实例0已准备就绪上午1:19:50-创建的web应用URL:http://quequetest.cloudapp.net/上午1:19:50-完成。
如果启用IntelliTrace,您是否可以获得更多详细信息,请告诉我们。
谨致问候,Eric
为了解决这个问题,我简单地删除了拥有工作者角色的原始云虚拟机实例,重新创建并重新发布了角色。从那一点来看,它运行得非常好。
我仍然无法确定是什么导致了错误,也没有任何其他员工角色出现过类似的问题。我在这里的假设是,VM存在配置问题,无法通过代码或Azure门户进行修改。