3

我正在尝试使用 SDK 工具 2.2 版在 Azure 中运行现有的工作 Web 应用程序。Web 应用程序作为“普通”MVC 4 站点运行良好,并且在本地 Azure 模拟器中运行良好。该应用程序设计为安装在服务器上或作为 Web 角色运行。

我整个周末都在尝试将它发布到 Azure,但总是得到

Server Error in '/' Application

信息。通过启用远程桌面,我可以查看事件日志,这就是我得到的消息。

(紧随其后,但出于 tl;dr 的目的,我认为绑定重定向没有被拾取,因为主要的抱怨是 System.Web.Mvc 3.0.0.0 无法加载。)

Event code: 3005 
Event message: An unhandled exception has occurred. 
Event time: 11/3/2013 10:36:10 AM 
Event time (UTC): 11/3/2013 10:36:10 AM 
Event ID: 2be088053f02484e95f3f17fcd95b67e 
Event sequence: 1 
Event occurrence: 1 
Event detail code: 0 

Application information: 
Application domain: /LM/W3SVC/1273337584/ROOT-1-130279485699443947 
Trust level: Full 
Application Virtual Path: / 
Application Path: F:\sitesroot\0\ 
Machine name: RD00155D463D30 

Process information: 
Process ID: 1536 
Process name: w3wp.exe 
Account name: NT AUTHORITY\NETWORK SERVICE 

Exception information: 
Exception type: InvalidOperationException 
Exception message: The pre-application start initialization method Initialize on type    Elmah.Mvc.Bootstrap threw an exception with the following error message: Could not load file or assembly 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040).
at System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore(ICollection`1 methods, Func`1 setHostingEnvironmentCultures)
at System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods)
at System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath)
at System.Web.Compilation.BuildManager.ExecutePreAppStart()
at System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)

Could not load file or assembly 'System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
at Elmah.Mvc.Bootstrap.Initialize()

Request information: 
Request URL: http://blizzard-propressroom.cloudapp.net/ 
Request path: / 
User host address: 176.27.246.0 
User:  
Is authenticated: False 
Authentication Type:  
Thread account name: NT AUTHORITY\NETWORK SERVICE 

Thread information: 
Thread ID: 5 
Thread account name: NT AUTHORITY\NETWORK SERVICE 
Is impersonating: False 
Stack trace:    at System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore(ICollection`1 methods, Func`1 setHostingEnvironmentCultures)
at System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods)
at System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath)
at System.Web.Compilation.BuildManager.ExecutePreAppStart()
at System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)

我尝试卸载 ELMAH 以防万一,但我仍然无法加载 MVC 版本 3.0.0.0。

现在这当然是有道理的,因为我正在运行 MVC 4,这就是我的包中的内容。

当然,在本地运行 v4 不是问题,因为我的 Web.config 具有:

<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>

但显然 Azure WebRoles 不能使用 Web.config (果然,如果我通过远程桌面找到源,那里有一个几乎空的 Web.config 文件)。

我已经看到我需要一个 app.config 的建议,我已经尝试过(只是 web.config 的直接副本)并将 Copy 设置为 Copy Always。我可以在我的 bin 文件夹中看到它的副本。

这一切对我来说似乎是一个非常令人困惑的箍,但似乎在 Azure 上绑定重定向的规则也随着每个 SDK 版本而变化,因此在线上有大量相互冲突的信息。

所以在一篇很长的帖子之后:请问有人知道我需要做什么来告诉 Azure 绑定重定向吗?(您是否同意这实际上是问题所在?)

更新

感谢@viperguynaz 的一些建议,但要确认我的 System.Web.MVC 被标记为副本 true。今天早上,我尝试完全删除我的 Azure 项目,并使用 Visual Studio 中的“转换为 Windows Azure 云服务项目”选项,以防一开始出现任何问题。但我仍然有同样的问题。

在 Azure 服务上使用远程桌面,我去了 E:\sitesroot\0。那里的 Web.config 几乎是空的。只是:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <machineKey decryption="AES" decryptionKey="F7FA540B4DFD82E5BB196B95D15FF81F6FC418E967F01A1C60FB407A84615031" validation="SHA1" validationKey="6FC418E967F01A1C60FB407A84615031902C0D9A9DE62168764FF0DCE537184F0535D5D9AD66DEDC6FC418E967F01A1C60FB407A84615031902C0D9A97DC1ABF" />
    </system.web>
</configuration>

我的 web.config 没有任何迹象。但其他所有内容都存在且正确,包括 Views 文件夹中的我的 Web.config。

我最新的构建和发布在构建过程中告诉了我一些非常有趣的事情:

warning WAT153: The web project 'xxx' is dependent on the following MVC assembly: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies\System.Web.Mvc.dll.
warning WAT153: The web project 'xxx' is dependent on the following MVC assembly: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\Assemblies\System.Web.WebPages.dll.
warning WAT153: The web project 'xxx' is dependent on the following MVC assembly: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\Assemblies\System.Web.Razor.dll
warning WAT153: The web project 'xxx' is dependent on the following MVC assembly: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\Assemblies\System.Web.WebPages.Razor.dll.
warning WAT153: The web project 'xxx' is dependent on the following MVC assembly: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\Assemblies\System.Web.WebPages.Deployment.dll.

对于所有这些:

MVC assemblies must be added to the package or installed on the virtual machine for your web role. For more details about this, see the following help page: http://go.microsoft.com/fwlink/?LinkId=218227.

现在这似乎很清楚,除了它们都设置为与项目一起复制,并且我的项目设置为 Web 角色(如链接所示)。链接中有关于必须使用 ASP Net MVC 安装创建启动文件夹并添加 WebStart cs 但我觉得这是过时的建议,否则为什么不“转换为 Windows Azure 云服务项目” “做这些工作?

更新 2

好的,看起来我的 Web.config 文件由于某种原因没有被打包。我挖出了一个在Azure中成功安装的项目,打开7-zip的包文件,发现里面捆绑了一个Web.config文件。这个问题项目中没有这样的 web.config 文件。我将开始尝试找出原因。

我还更新了问题标题以反映此信息。这几乎肯定是一切的原因。

4

3 回答 3

2

原来这与Azure ASP.NET MVC Web.Config 部署问题的情况相同

我的 web.config 的 deploy 值为“none”(不知何故),因此没有包含在包中,这意味着创建了一个几乎为空的默认值。

我将部署类型更改为“内容”(使用 Web.config 上的属性),现在它被捆绑了。

于 2013-11-04T13:34:09.620 回答
0

我认为您在 RDP 会话中没有找到正确的 web.config。站点(Web 应用程序)存储在虚拟硬盘驱动器上,通常为 e:\sitesroot\0 或 f:\sitesroot\0 - 您可以通过打开 IIS 并检查站点物理目录来确认这一点。在该目录中,您将找到在构建/打包过程中转换的 web.config。这是您的站点使用的 web.config。通过添加部分开始您的故障<customErrors mode="Off"/>排除<system.web>。然后从 IIS 本地浏览该站点。我怀疑您没有将 System.Web.Mvc 设置为Copy Local = True. 接下来,您的 web.config 构建设置应该是:

  • 构建动作 = 内容
  • 复制到输出目录 = 不要复制(您不希望 bin 目录中的 web.config 文件)。

作为 Azure 部署的一般经验法则,如果您的应用程序使用的程序集的路径不在 中..\Reference Assemblies\..,那么您很可能需要设置Copy Local = True为将程序集包含在您的 bin 目录中。

于 2013-11-03T17:21:34.320 回答
0

确保在您.csproj的文件中包含该文件,否则它将被忽略

<ItemGroup>
    ...
    <Content Include="App_Data\XMLDocument.xml" />
    <Content Include="Areas\HelpPage\HelpPage.css" />
    <Content Include="Areas\HelpPage\Views\Web.config" />   <----- THIS LINE
    <Content Include="Areas\HelpPage\Views\Help\Api.cshtml" />
    <Content Include="Areas\HelpPage\Views\Help\DisplayTemplates\ApiGroup.cshtml" />
    ...
</ItemGroup>

(由于建议编辑队列已满而添加)

于 2020-09-08T13:34:37.297 回答