ASP.NET Core 1.1 在本地运行良好,但发布到 Azure 时显示“启动应用程序时发生错误”。
Posted
技术标签:
【中文标题】ASP.NET Core 1.1 在本地运行良好,但发布到 Azure 时显示“启动应用程序时发生错误”。【英文标题】:ASP.NET Core 1.1 runs fine locally but when publishing to Azure says "An error occurred while starting the application." 【发布时间】:2017-06-14 09:46:10 【问题描述】:我一直在开发一个 ASP.NET Core Web 应用程序,主要基于 Visual Studio 2017 RC2 中提供的 MVC 模板。它在本地调试模式下运行得很好,但是当我尝试将其发布到 Azure 托管的 Web 应用程序时,我收到此错误:
启动应用程序时出错。
.NET Core X86 v4.1.1.0 | Microsoft.AspNetCore.Hosting 版本 1.1.0-rtm-22752 |微软视窗 6.2.9200
我试过在web.config文件中设置stdoutLogEnabled="true"
,但是好像没有效果,还是一样的错误。
更新:
在一些帮助下,我设法检索了日志,它说:
Application startup exception: System.TypeLoadException: Could not load type 'System.IO.File' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e'.
at Microsoft.Extensions.DependencyModel.FileWrapper.OpenRead(String path)
at Microsoft.Extensions.DependencyModel.DependencyContextLoader.LoadEntryAssemblyContext(IDependencyContextReader reader)
at Microsoft.Extensions.DependencyModel.DependencyContextLoader.Load(Assembly assembly)
at Microsoft.Extensions.DependencyModel.DependencyContext.Load(Assembly assembly)
at Microsoft.AspNetCore.Mvc.Internal.DefaultAssemblyPartDiscoveryProvider.DiscoverAssemblyParts(String entryPointAssemblyName)
at Microsoft.Extensions.DependencyInjection.MvcCoreServiceCollectionExtensions.GetApplicationPartManager(IServiceCollection services)
at Microsoft.Extensions.DependencyInjection.MvcCoreServiceCollectionExtensions.AddMvcCore(IServiceCollection services)
at Microsoft.Extensions.DependencyInjection.MvcServiceCollectionExtensions.AddMvc(IServiceCollection services)
at Bla.Api.Startup.ConfigureServices(IServiceCollection services) in C:\Users\user\Source\Workspaces\Bla\Bla.Api\src\Bla.Api\Startup.cs:line 73
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.ConfigureServices(IServiceCollection services)
at Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices()
at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()
Hosting environment: Production
Content root path: D:\home\site\wwwroot
Now listening on: http://localhost:1264
Application started. Press Ctrl+C to shut down.
它在第 73 行引用的代码行是:
services.AddMvc();
更新:
我的 global.json 文件如下所示(其中 Bla.Api 是项目的名称,该文件位于解决方案根文件夹中)。
"projects": [ "Bla.Api" ],
"sdk":
"version": "1.1.0"
【问题讨论】:
您在 Azure 中运行的 .NET SDK 版本可能与在本地运行的版本不同。考虑将 global.json 文件添加到您的项目中,将 SDK 固定在特定版本。 docs.microsoft.com/en-us/dotnet/articles/core/tools/… 感谢肖恩的提示!我的模板没有附带 global.json 文件,所以我创建了一个并将它放在解决方案的根文件夹中。我为 SDK 尝试了几个不同的版本号(1.1.0 和 1.1.0-rtm-22752),但我认为它没有任何效果。没啥事儿。也许我错过了什么? 等等,我认为它成功了!重新创建一个新的 Azure Web App 就可以解决问题。新的错误是我缺少一个环境变量(因为它是一个新的网络应用程序,我还没有创建它)。我设置好之后就没事了。所以我对以前的网络应用程序以某种方式搞砸的假设是正确的,我想......无论如何,感谢大家的帮助!哇! @derf26 我鼓励您花 20 分钟左右的时间输入自己的答案作为事后分析。对我来说这将是一本有趣的书,可以确切地知道出了什么问题。 我已经写了一个简短的总结,其中包括什么有效和无效,以及我学到了什么:) 再次感谢您的所有帮助。我很高兴它终于可以工作了:D 【参考方案1】:由于许多不同的问题都可能导致此错误页面,因此我强烈推荐以下方法,以便快速轻松地确定根本原因,而无需费力 Azure(或任何服务器/平台)来获取日志。
您可以通过在您的程序中设置 .UseSetting("detailedErrors", "true")
和 .CaptureStartupErrors(true)
操作来启用非常有用的在启动时对开发人员友好的错误消息。 .cs 文件。
对于 ASP.NET Core 1.x
public static void Main(string[] args)
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseSetting("detailedErrors", "true")
.UseIISIntegration()
.UseStartup<Startup>()
.CaptureStartupErrors(true)
.Build();
host.Run();
(2018/07) ASP.NET Core 2.1 更新
public class Program
public static void Main(string[] args)
BuildWebHost(args).Run();
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.CaptureStartupErrors(true)
.UseSetting("detailedErrors", "true")
.UseStartup<Startup>()
.Build();
这些设置应在您完成故障排除后立即删除,以免您的应用程序遭受恶意攻击。
【讨论】:
这真的帮助我找出问题所在!非常感谢! 天哪……我从来不知道!这很棒,但是有什么方法可以为每个环境设置它吗? :D @ppumkin 是的 - 只需从相关配置/环境中捕获设置并在调用.UseSetting("detailedErrors", [env-setting])
和 .CaptureStartupErrors([env-setting])
时使用这些设置,请参阅 docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration
@Steveland83 你应该如何捕捉环境?我查看了链接,但没有看到确切的方法。我应该这样做var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
@Met-u 是的,就是这样。不要忘记,您需要在 Web.config
(请参阅 docs.microsoft.com/en-us/aspnet/core/host-and-deploy/… )或在服务器上手动设置这些变量为每个环境:***.com/a/41551429/7840778【参考方案2】:
通过 sftp 客户端连接并手动删除 site/wwwroot 文件夹中的所有内容。重新发布
自从我将托管在 Azure 上的应用程序从 MVC 4 迁移到 .net 核心后,我就遇到了问题。
几周前的某个时候,我在成功发布后无法运行项目。我什至两次尝试删除整个应用服务配置文件并使用相同的名称重新创建它。但是,当我将“2”附加到应用服务名称(以创建从未使用过的应用服务)时,发布完全相同的项目并进行 0 次更改时效果很好。如果我可以成功发布到新的应用服务,但不能成功发布到已删除并重新创建的应用服务,那么删除究竟会做什么?每次发布都检查了在目标位置删除现有文件,但也没有做任何事情。
我今天遇到了与我的 #2 站点的 OP 中所示相同的错误。它发生在尝试更新一些 asp nuget 包并重新部署之后。真的不想继续迭代我的应用服务的 myApp3,我决定使用 azure 概述页面中提供的 FTP 信息。我导航到 Site/wwwroot 并从 FTP 客户端中删除了所有内容。然后我发布了应用程序,它工作了。我只能得出结论,“删除”复选框无法正常工作。
【讨论】:
感谢 Pete 的提示,我希望如果我再次遇到这个问题,我也能做到。和你一样,我真的不想删除和重新创建网络应用程序! 您也可以通过 azure 中的开发者控制台执行此操作。【参考方案3】:感谢大家的建议。但最终唯一有效的是删除了我无法发布到的 Azure Web 应用程序,并创建了一个全新的应用程序。我想也许以前的运行时环境中的一些 .dll 仍然存在或者没有被更新......不管它是什么,重新创建它是有效的。但希望我不会再遇到这个错误,因为你不能在生产中真正做这种事情。
对 global.json 文件进行更改似乎没有效果。
从模板创建一个全新的 API 也无济于事,问题出在 Azure Web App 本身,因为一切都在本地运行良好。
另一个非常有用的提示是根据其他答案添加日志记录(以及根中的“日志”文件)。这至少为我指明了正确的方向。同时使用dotnet --version
检查您的运行时。
再次感谢大家的帮助!
【讨论】:
【参考方案4】:我也遇到了同样的问题。只是没有部署在 Azure,我将本地计算机用作服务器并将其托管在 IIS 中。
An error occurred while starting the application.
.NET Core X64 v4.1.1.0 | Microsoft.AspNetCore.Hosting version 1.1.1 | Microsoft Windows 10.0.14393 | Need help?
这已通过更改 web.config 解决。
第一组stdoutLogEnabled = "true"
然后确保stdoutLogFile=".\logs\stdout" />
这个文件夹存在。
然后重启IIS,你可以在日志文件中找到真正的问题。
【讨论】:
就我而言,真正的问题实际上是 .NET Core 未正确部署的错误,而不是我所做的事情。重新创建整个 Azure Web 应用程序是修复它的唯一方法,我的代码从未更改过。但是,是的,通常这是弄清楚发生了什么的好建议。 我这样做 - 没有创建日志文件【参考方案5】:删除来自 wwwroot/your_application_folder 的所有现有 dll,然后复制所有发布输出文件和文件夹。
问题发生在 NUGETS 自行更新时。如果您不清理 wwwroot/your_application_folder 下的现有文件,IIS 会出现上述错误。
【讨论】:
【参考方案6】:清理并重建修复了所有问题。
【讨论】:
【参考方案7】:问题可能重复 - 请参考ASP.NET Core hosting - 500 internal server error。
快速回答:
您需要设置:stdoutLogEnabled="true"
和 stdoutLogFile=".\logs\stdout"
。另外,您需要手动创建logs
文件夹。
【讨论】:
感谢您的提示!我已经根据链接的答案创建了文件夹结构,看起来像是创建了一个日志,但我实际上无法打开它。见这里:imgur.com/a/bvAD7 原来是因为那个日志文件仍然被我猜想的应用程序打开......一定有一个句柄。重新部署创建了一个新的日志文件并发布了旧的,我已经用日志的内容更新了我的问题。【参考方案8】:就我而言,这是因为我试图发布用于 Fabook OAuth 的用户机密。我知道这是一个非常具体的答案,但如今 OAuth 似乎很常见。事实证明,用户机密并不是要发布的。谁知道呢。
所以为了测试这一点,我临时更改了 startup.cs 中的以下代码。此数据不应作为最佳实践的一部分进行硬编码,因为它最终会在源代码管理中以明文形式出现。
之前
app.UseFacebookAuthentication(new FacebookOptions()
AppId = Configuration["Authentication:Facebook:AppId"],
AppSecret = Configuration["Authentication:Facebook:AppSecret"]
);
之后
app.UseFacebookAuthentication(new FacebookOptions()
AppId = "0000000000000", // your value
AppSecret = "0000000000000000000000000000000" // your value
);
然后它起作用了。
【讨论】:
【参考方案9】:在我的情况下,那是因为我试图在 Startup 中获取一些数据,而生产环境中没有更新 dbcontext。
将我的 ConnectionString 更改为 Production 并运行 Update-Database,问题就解决了。
【讨论】:
【参考方案10】:在我的例子中,app 目录中缺少一个名为 Resources 的目录。
【讨论】:
以上是关于ASP.NET Core 1.1 在本地运行良好,但发布到 Azure 时显示“启动应用程序时发生错误”。的主要内容,如果未能解决你的问题,请参考以下文章
Azure WebApp Asp.NET Core 2 错误:启动应用程序时出错
IIS 部署不能包含 asp.net core 2.2 razor 页面中 wwwroot 文件夹的文件
非托管代码中的 ASP Net Core 1.1 和 EF 6 异常?