Web角色无法启动,因为无法加载依赖程序集

时间:2015-03-28 15:06:31

标签: azure azure-web-roles webrole

我在网络角色启动时遇到了一个奇怪的问题。 完整的repro非常复杂,但我找到了根本原因,所以我将简化步骤。

我的webrole项目取决于AssmeblyA,而AssmeblyA又取决于AssemblyB,Version = 1.0。 webrole也直接依赖于AssemblyB,但版本= 2.0。 (这一切都来自不同的NuGet包,我无法控制)。

最后,AssemblyB,Version = 2.0被复制到\ Bin文件夹。 网站本身工作正常,因为在Web.config中有一个绑定重定向AssemblyB到版本= 2.0(由nuget客户端自动放在那里)。

但是,当webrole部署到Azure时,无法启动,因为无法加载AssemblyB,Version = 1.0。

我怀疑这是因为Web角色首先从Approot目录加载,其中web.config无效。我还发现我可以通过为web角色生成app.config并在那里复制所有绑定重定向来解决此问题。虽然这有效,但维护这样的设置并不是很方便。

有人知道这是否是Azure网络角色的已知问题?

尝试使用Azure SDk 2.4和2.5.1,所有azure nuget包都是最新的,没有任何自定义启动代码。

更新的 以下是通过IntelliTrace获得的异常:

  

由于以下例外情况,无法加载角色入口点:    - System.IO.FileLoadException:

     

无法加载文件或程序集' Microsoft.Owin,Version = 3.0.0.0,   Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或其中一个   依赖。定位程序集的清单定义没有   匹配程序集引用。 (HRESULT异常:0x80131040)   文件名:' Microsoft.Owin,Version = 3.0.0.0,Culture = neutral,   公钥= 31bf3856ad364e35'

这是堆栈跟踪:

CommonLanguageRuntimeLibrary!System.Reflection.RuntimeModule.GetTypes() 
CommonLanguageRuntimeLibrary!System.Reflection.Assembly.GetTypes()  
Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetRoleEntryPoint(System.Reflection.Assembly entryPointAssembly = {System.Reflection.RuntimeAssembly})  
Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.CreateRoleEntryPoint(Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleType roleTypeEnum = IISWeb)    
Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleType roleTypeEnum = IISWeb)  
Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRole(Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleType roleType = IISWeb)  
Microsoft.WindowsAzure.ServiceRuntime.dll!Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge.AnonymousMethod()   
CommonLanguageRuntimeLibrary!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext = {unknown}, System.Threading.ContextCallback callback = {unknown}, object state = {unknown}, bool preserveSyncCtx = {unknown})   
CommonLanguageRuntimeLibrary!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext = {unknown}, System.Threading.ContextCallback callback = {unknown}, object state = {unknown}, bool preserveSyncCtx = {unknown})   
CommonLanguageRuntimeLibrary!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext = {unknown}, System.Threading.ContextCallback callback = {unknown}, object state = {unknown}) 
CommonLanguageRuntimeLibrary!System.Threading.ThreadHelper.ThreadStart()

发生错误是因为我的Web角色项目依赖于Owin Version = 3.0.1.0,但另一个DLL(我通过nuget获取)依赖于Owin Version = 3.0.0.0。因此明显不匹配。

所以似乎服务运行时仍然在WaIISHost.exe中加载我的程序集只是为了检查我是否有RoleEntryPoint(我不是)。 和以前一样,只要将带有从web.config复制的绑定重定向的myassembly.dll.config放到E:\ approot \ bin中,一切都会正常启动。

2 个答案:

答案 0 :(得分:1)

您能否澄清一下您究竟在寻找什么?您在问题中提供了答案(将重定向添加到app.config),并在其中一条评论(http://blogs.msdn.com/b/avkashchauhan/archive/2011/01/24/dissection-of-a-windows-azure-sdk-1-3-based-asp-net-web-role-in-full-iis-mode-amp-hwc.aspx)中提供了解释的链接。

我可以确认您所看到的是预期的行为,并且您将绑定重定向添加到app.config的解决方案是正确的。

另一个可能的解决方案是更改RoleEntrypoint代码(即WebRole.cs),使其不依赖于AssemblyB,Version = 1.0。无论您在RoleEntrypoint类中执行什么操作,都可以从Application_Start中完成,以便它在IIS中运行吗?

答案 1 :(得分:0)

Azure支持团队提供AzureTools来帮助解决此类问题。 AzureTools具有Fusion Logging开启/关闭功能,可以轻松收集天蓝色日志。

启用Fusion Logging后,您可以获得有关缺失装配的更多信息。

http://blogs.msdn.com/b/kwill/archive/2013/08/26/azuretools-the-diagnostic-utility-used-by-the-windows-azure-developer-support-team.aspx