IIS 错误 502.5 上的 ASP.NET Core 1.0

Posted

技术标签:

【中文标题】IIS 错误 502.5 上的 ASP.NET Core 1.0【英文标题】:ASP.NET Core 1.0 on IIS error 502.5 【发布时间】:2016-07-27 22:49:49 【问题描述】:

我刚刚将我的服务器 (Windows 2012R2) 从之前的 .Net Core 1.0 RC2 更新为 .Net Core 1.0 RTM Windows 主机包。我的应用在我的电脑上运行没有任何问题,但服务器一直显示:

HTTP Error 502.5 - Process Failure


Common causes of this issue:

The application process failed to start
The application process started but then stopped
The application process started but failed to listen on the configured port

它以前适用于 RC2 版本。不知道会出什么问题。

这就是事件查看器所说的:

Failed to start process with the commandline 'dotnet .\MyWebApp.dll'. Error code = '0x80004005'.

最糟糕的是,应用程序日志是空的!我的意思是那些 stdout_xxxxxxxxx.log 文件完全是空的,并且都是 0 字节大小。

我该怎么办??未记录时如何知道错误原因??

【问题讨论】:

可能相关? ***.com/questions/37362183/… 它有什么关系?错误代码明显不同。更不用说我说它可以在我自己的带有 IIS 的 PC 上运行。 首先,我说可能相关,因为提到Failed to start process with commandline 'dotnet ./bin/Debug/netcoreapp1.0/WebApplication2.dll', Error Code = '0x80004005'. - 您报告的命令行和错误代码相同。其次,仅仅因为它在您的机器上运行,而不是在远程机器上运行,就表明服务器上有一些不同的东西。如果您可以扩展应用程序如何部署到服务器,那将很有帮助。 你的应用程序在你的电脑上运行是什么意思。你的意思是你有一个项目部署到 iis?我是ryt吗? @VSG24 你看到这部分的 asp.net 文档了吗? Publishing to IIS,它列出了常见错误并列出了 502.5 错误的几个原因。 【参考方案1】:

我可以通过运行来修复它

"C:\Program Files\dotnet\dotnet.exe" "C:\fullpath\PROJECT.dll"

在命令提示符下,这给了我一个更有意义的错误:

"指定的框架'Microsoft.NETCore.App',版本'1.0.1'是 未找到。 - 检查应用程序依赖项并定位安装在以下位置的框架版本: C:\Program Files\dotnet\shared\Microsoft.NETCore.App - 安装了以下版本: 1.0.0 - 或者,安装框架版本“1.0.1”。

如您所见,我的服务器上安装了错误的 NET Core 版本。卸载之前的 1.0.0 版本并安装正确的 1.0.1 版本后,我能够运行我的应用程序。

【讨论】:

我设法使用它来发现我需要安装 NodeJS...因为它确实给出了“更有意义的消息”。 我无法告诉你我在这件事上浪费了多少时间。谢谢你。我的错误与缺少证书有关。为什么我不能通过一些理智的方法得到这个错误? 谁能告诉我命令是什么?什么是 C:\fullpath\dotnet ?您的应用程序的路径,但 dotnet 是什么?项目文件夹中没有dotnet文件 @JeremyThompson 它是 dotnet.exe 的路径,通常位于:C:\Program Files\dotnet\dotnet.exe 我刚刚在 .NET CORE 2.1.3 更新后通过安装正确的 .NET SDK/运行时修复了这个错误。【参考方案2】:

我有同样的问题,在我的情况下,我的应用程序池的用户身份权限不足,在 asp.net 文档的Publishing to IIS 页面上,有几个原因列出了这个错误:

如果您发布了自包含应用程序,请确认您没有在project.jsonbuildOptions 中设置与发布RID 冲突的平台。例如,不要指定 x86 平台并使用 win81-x64 (dotnet publish -c Release -r win81-x64) 的 RID 发布。该项目将在没有警告或错误的情况下发布,但会在服务器上记录上述异常而失败。 检查 web.config 中 <aspNetCore> 元素上的 processPath 属性,以确认它是用于便携式应用程序的 dotnet 或用于独立应用程序的 .\my_application.exe。 对于便携式应用程序,dotnet.exe 可能无法通过 PATH 设置访问。确认C:\Program Files\dotnet\ 存在于系统路径设置中。 对于可移植应用程序,dotnet.exe 可能无法以应用程序池的用户身份访问。确认 AppPool 用户身份有权访问 C:\Program Files\dotnet 目录。 通过调用应用程序的WebHostBuilder().UseIISIntegration() 方法,确认您已正确引用了IIS 集成中间件。 如果您在使用 Kestrel 自托管时使用 .UseUrls() 扩展方法,请确认它位于 WebHostBuilder() 上的 .UseIISIntegration() 扩展方法之前。在 IIS 后面运行 Kestrel 时,.UseIISIntegration() 必须为反向代理设置 Url,并且其值不会被 .UseUrls() 覆盖。

在我的情况下,这是第四个原因,我通过右键单击我的应用程序池来更改它,并在进程模型下的高级设置中,我将身份设置为具有足够权限的用户:

【讨论】:

这是我一直在寻找的答案!在我的情况下,它也是应用程序池...... 谢谢。就我而言,问题在于 dotnet 的路径。在系统事件查看器中找到这样的日志:Failed to start process with commandline '"dotnet" .\PROJECT.dll', ErrorCode = '0x80070002'. 我会添加另一个原因:“安装程序无法获取 VC++ Redistributable”,因为我的服务器没有互联网连接,它无法下载这个包......因此,你必须手动下载它:@ 987654323@ 并安装它。 dotnet 在我的路径中,但需要重新启动服务器才能识别它。 在我的情况下,如果我提供 --framework 选项,我必须在发布命令中指定 --runtime 值,否则不要提供 --framework 并且它默认计算运行时。【参考方案3】:

我通过硬重置 IIS 来完成这项工作(我刚刚安装了托管包)。

事实证明,仅在 IIS 管理器中按“重新启动”是不够的。我只需要打开命令提示符并输入“iisreset”

【讨论】:

我还在 UI 中的 webserver 根节点处按下了绿色回收 iis。结合应用程序池的用户设置到LocalSystem,这为我解决了 谢谢迈克尔...这也解决了我的问题。一直在寻找答案几个小时。谢谢! 发送!您的回答让我想起了 ms docs "Restart the system or execute net stop was /y 然后从命令提示符执行 net start w3svc 以获取对系统路径。” (安装 .NET Core Windows Server Hosting 包后) 也解决了我的问题。谢谢 为我工作。谢谢:)【参考方案4】:

所以我有了一个新服务器,这次是 Windows 2008R2,我的应用程序运行良好。

我不能确定旧服务器的问题是什么,但我有一个想法。

所以因为我之前编译过的应用程序没有考虑任何平台,所以它给了我dll 版本,只有在目标主机安装了.Net Core Windows Hosting 包时才有效。就我而言,它已安装,这很好

应用程序无法运行后,我决定将其编译为控制台应用程序,并使用 win7-x64 作为运行时。这一次,当我在服务器上运行我的应用程序的exe 时,它因缺少 dll 的错误而崩溃:

The program can't start because api-ms-win-crt-runtime-l1-1-0.dll is missing

该 dll 来自于包含在 Visual C++ Redistributable for Visual Studio 2015 中的 Universal C Runtime。

我尝试在 Windows Server 2012 R2 上安装该软件包(x64 和 x86),但每次都失败(不知道为什么)。

但是当我尝试在新服务器 Windows Server 2008 R2 中安装它们时,它们安装成功。这可能是它背后的原因,但仍然不能肯定。

【讨论】:

【参考方案5】:

我在发布网络应用时遇到了同样的问题。 如果有人仍然有这个问题,请通过更改 AppName.runtimeconfig.json

    
  "runtimeOptions": 
    "framework": 
      "name": "Microsoft.NETCore.App",
      "version": "1.1.2"
    ,
    "configProperties": 
      "System.GC.Server": true
    
  

将版本从 "version": "1.1.2" 更改为 "version": "1.1.1" 一切正常

【讨论】:

【参考方案6】:

我遇到了同样的问题。

为了找出它的确切来源,我打开了登录 web.config 文件:

<aspNetCore processPath="dotnet" arguments=".\MyWebService.dll" stdoutLogEnabled="**true**" stdoutLogFile=".\logs\stdout" />

并在 MyWebService 根文件夹中创建了日志子文件夹。

重新启动 IIS 并尝试执行 API 后出现错误,并且缺少正确的核心运行时。下载安装 DotNetCore.1.0.5_1.1.2-WindowsHosting 后错误消失了。

【讨论】:

IMO 您应该从“true”值中删除星号以避免任何混淆。【参考方案7】:

遇到同样的问题,但所有解决方案均无效。找到这颗宝石,并认为如果它对其他人有帮助,我会传递下去。在 Server 2012 R2 上安装得到 DLL 丢失错误,尝试重新安装 VS C++ 2015 并得到错误。修复是执行以下操作:

似乎是文件 C:\ProgramData\Package Cache\...\packages\Patch\x64\Windows8.1-KB2999226-x64.msu 安装有问题。 打开管理员命令提示符:

c:
mkdir tmp
mkdir tmp\tmp
move "C:\ProgramData\Package Cache\...\packages\Patch\x64\Windows8.1-KB2999226-x64.msu" c:\tmp
expand -F:* c:\tmp\Windows8.1-KB2999226-x64.msu c:\tmp\tmp
dism /online /add-package /packagepath:c:\tmp\tmp\Windows8.1-KB2999226-x64.cab

注意:将“...”替换为正确的文件夹名称。在此之后重新安装 VS C++ 2015 包。

【讨论】:

【参考方案8】:

我也有类似的问题,引用福尔摩斯的话: “当你排除了不可能的事情后,剩下的,无论多么不可能,一定是真相?

我检查了我所针对的 .NET 框架是否安装在服务器上,结果发现不是。我安装了 4.6.2 .NET Framework,它工作正常。

【讨论】:

【参考方案9】:

在我的 VS 项目自动升级到 .NET Core 1.1.2 后,我在生产服务器上遇到了这个问题。

我只是从这里在我的生产服务器上安装了 1.1.2 .net 核心运行时:https://www.microsoft.com/net/download/core#/runtime

【讨论】:

我遇到了同样的问题,但使用的是新发布的 net core 2.0.6。通过在生产服务器上安装 net core SDK 2.0.6 修复【参考方案10】:

已解决我今天在部署到 AZURE 时遇到了同样的问题。然后我对本地 IIS 进行了同样的尝试,遇到了同样的问题。由于我是 .net CORE 的新手,在我真正解决它之前挣扎了几个小时。

在我们的解决方案中,在我发布到 IIS 后,我观察了我的 web.confile 文件,特别是在 &lt;aspNetCore processPath="bin\IISSupport\VSIISExeLauncher.exe" arguments="-argFile IISExeLauncherArgs.txt" forwardWindowsAuthToken="false" stdoutLogEnabled="false" /&gt; 行下方

在我们的部署文件夹中,生成的 web.config 如下所示:&lt;aspNetCore processPath="dotnet" arguments=".\Yodlee.dll -argFile IISExeLauncherArgs.txt" forwardWindowsAuthToken="false" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" /&gt;

现在请尝试将 Visual Studio 解决方案中的上述配置更改为&lt;aspNetCore processPath="bin\IISSupport\VSIISExeLauncher.exe" forwardWindowsAuthToken="false" stdoutLogEnabled="false" /&gt;

在我们的新部署文件夹中,生成的 web.config 如下所示:&lt;aspNetCore processPath="dotnet" arguments=".\Yodlee.dll" forwardWindowsAuthToken="false" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" /&gt;

这解决了我的问题,希望对您有所帮助。

【讨论】:

嘿@Agni,这对我有用,谢谢。但是,每次我尝试再次将项目发布到 Azure 时,它​​都会重新构建,并且 web.config 会自动更改回原始配置,其中导致问题的部分是:“-argFile IISExeLauncherArgs.txt”。你找到解决方案了吗? (我使用的是 asp.net core 2.0)。 就我而言,我必须将processPath="dotnet" 更改为processPath="C:\Program Files\dotnet\dotnet.exe"。然后它起作用了。【参考方案11】:

当我将开发机器更新到 Core 1.0.1 时,我遇到了同样的问题,但忘记更新服务器。

【讨论】:

对我来说,我从这里重新安装了 net core SDK:microsoft.com/net/core#windows 然后它工作了。 VS2017 现在默认为 .NET Core 1.1 - 在将升级的 projs 发布到 IIS 之前,需要更新所有远程服务器。您可以获得更有用的错误消息(“.NET core 1.1 not installed”)但运行 dotnet .\YOURPROJDLL.dll【参考方案12】:

我在尝试将我的 .NET Core 2.0 API 发布到 AWS EB 时遇到 HTTP 错误 502.5,并通过将以下代码添加到 .csproj 来解决该问题:

  <PropertyGroup>
    <PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
  </PropertyGroup>

【讨论】:

【参考方案13】:

我有同样的问题。我将应用程序池标识更改为网络服务帐户。然后,我在 web.config 中明确设置了 dotnet.exe 的路径,以便应用程序正常工作,正如@danielyewright 在他的github 评论中所说的那样。设置路径后生效。

谢谢

【讨论】:

【参考方案14】:

在我的情况下分享这个错误是因为我忘记更新 project.json 为:

"buildOptions": 
    "emitEntryPoint": true
  

【讨论】:

【参考方案15】:

我遇到了同样的错误,与 VSG24 在建议的答案中描述的问题相同 - 在 CMD 中键入“dotnet”时出现令人讨厌的错误消息:

程序无法启动,因为缺少 api-ms-win-crt-runtime-l1-1-0.dll

我通过在 Windows Server 2012 R2 上手动安装以下 2 个更新解决了这个问题(以及相关的先决条件和所有其他更新 - 请仔细阅读 Microsoft 网站上的安装说明):

    KB2919355 KB2999226

希望这对某人有所帮助。

【讨论】:

【参考方案16】:

当我尝试发布我的 Web 应用程序的调试版本时,我遇到了同样的问题。这组文件不包含属性processPath 的正确值的文件web.config

我从 Release 版本中获取此文件,值已分配给我的 exe 文件的路径。

<aspNetCore processPath=".\My.Web.App.exe" ... />

【讨论】:

【参考方案17】:

在我的情况下,服务器上安装的 Net Core 版本有问题。 我只是在我的开发机器上安装了相同的版本,一切都很好:-)

【讨论】:

【参考方案18】:

这是我的想法,最近在 Windows 10 上安装了更新后发生了这种情况。根据我收集到的信息,安装了一个 Windows Defender 更新,假定我的“Project.dll”(一个 asp.net 核心项目)表现得像病毒,所以它被删除了。

所以,我建议您在开始安装/卸载东西之前做的第一件事是检查以确认您的“Project.dll”在它应该在的位置。

如果它不再存在,请将其复制回该位置。

如果您难以将文件复制回来,请在 Windows Defender 中将排除项添加到您的项目文件夹。 (Learn how to do that here.)

这对我很有效,我在应用程序的多个服务器上重复了它。

【讨论】:

【参考方案19】:

我需要安装找到的最新 .net Core 版本 here。 无需重启站点或服务器

【讨论】:

【参考方案20】:

我通过向站点的应用程序添加“编辑权限”来解决它,映射到物理目录,然后选择可以访问此根文件夹的 Windows 用户。 (专用网络)。

【讨论】:

【参考方案21】:

在我的情况下,安装 AspNetCore.2.0.6.RuntimePackageStore_x64.exeDotNetCore.2.0.6-WindowsHosting.exe 后,我需要重新启动服务器以使其在没有 502 bad gateway 和 proxy 错误的情况下正常工作。

更新:

有一种方法可以在不重新启动的情况下使用它: https://***.com/a/50808634/3634867

【讨论】:

【参考方案22】:

使用管理员凭据打开命令提示符

输入以下命令并回车

> IISRESET

使用管理员凭据打开Visual Studio 2017

Package Manager Console中输入以下命令并回车

PM> IISRESET

PM> IISRESET
Attempting stop...
Internet services successfully stopped
Attempting start...
Internet services successfully restarted

【讨论】:

【参考方案23】:

我也遇到了这个问题(VS 15 和 17 都出现了错误)。但是在 VS15 上它返回了 CONNECTION_REFUSED 错误,在 VS17 上它返回了 ASP.NET Core 1.0 on IIS error 502.5

修复

    导航到您的项目目录并找到隐藏文件夹.vs(它位于项目文件夹目录中)。 (记得显示隐藏的文件/文件夹)

    关闭VS

    删除 .vs 文件夹 以管理员身份启动 VS(VS 将重新创建 .vs 文件夹)

【讨论】:

【参考方案24】:

对我来说,Startup.cs 中的 connectionString 在以下位置为空:

services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

它为空,因为应用程序没有在 appsettings.json 中查找连接字符串。

必须将 Program.cs 更改为:

public static void Main(string[] args)

    BuildWebHost(args).Run();


public static IWebHost BuildWebHost(string[] args) =>
     WebHost.CreateDefaultBuilder(args)
     .ConfigureAppConfiguration((context, builder) => builder.SetBasePath(context.HostingEnvironment.ContentRootPath)
     .AddJsonFile("appsettings.json").Build())
     .UseStartup<Startup>().Build();

【讨论】:

【参考方案25】:

我不知道为什么这对我有用,但我正在使用 Windows 身份验证,并且我在 Program.cs 中的 BuildWebHost 上有这段代码:

.UseStartup<Startup>()
.UseHttpSys(options =>

    options.Authentication.Schemes =
        AuthenticationSchemes.NTLM | AuthenticationSchemes.Negotiate;
    options.Authentication.AllowAnonymous = false;
)
.Build();

删除.UserHttpSys 位后,它现在可以工作了,我仍然可以作为域用户进行身份验证。

BuildWebHost 现在看起来像

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .Build();

【讨论】:

我在 aspnet 核心中进行 cookie 身份验证。如何配置? @kudlatiger 抱歉,我不确定 - 你最好的选择是创建一个单独的问题【参考方案26】:

我遇到了同样的错误,发现问题是在发布到 Azure 的过程中,我的 web.config 文件被修改了,所以下面这行最终是这样的:

<aspNetCore processPath="bin\IISSupport\VSIISExeLauncher.exe" arguments="-argFile IISExeLauncherArgs.txt" forwardWindowsAuthToken="false" stdoutLogEnabled="false" startupTimeLimit="3600" requestTimeout="23:00:00" />

生产的问题是参数的内容:"-argFile IISExeLauncherArgs.txt"

看起来这个问题将在下一个 .NET Core SDK(目前处于预览阶段)中得到解决,但目前的解决方法是将此块添加到 .csproj 文件中:

<Target Name="bug_242_workaround" AfterTargets="_TransformWebConfig">
    <Exec Command="powershell &quot;(Get-Content '$(PublishDir)Web.config').replace(' -argFile IISExeLauncherArgs.txt', '') | Set-Content '$(PublishDir)Web.config'&quot;" />
  </Target>

这将修改 web.config 并删除有问题的部分以进行发布。

参考:https://github.com/aspnet/websdk/issues/242

希望对你有帮助。

【讨论】:

正在添加的 startupTimeLimit 和 requestTimeout 属性似乎都是 tooling bug。【参考方案27】:

更改发布配置后为我工作。

【讨论】:

抱歉,我在我的组织中看不到图像。图片下载被阻止(在大多数组织中)。【参考方案28】:

对我来说,这是由于安装了不同版本的 .Net Core 造成的。我匹配了我的开发和生产服务器并且它工作正常。

【讨论】:

【参考方案29】:

我遇到了类似的问题(Asp.Net Core 2.x),这是由于尝试在 64 位 Windows 服务器上的 IIS 中运行 32 位 asp.net 核心应用程序引起的。根本原因是自动生成的 web.config(如果您的项目没有明确包含一个,默认情况下 asp.net 核心项目不包含)不包含 dotnet 可执行文件的完整路径。当您在 64 位机器上安装托管包时,它将安装 64 位和 32 位版本的 dotnet,但默认情况下路径将解析为 64 位,并且您的 32 位 asp.net 核心应用程序将无法加载。在您的浏览器中,您可能会看到 502.5 错误,如果您查看服务器事件日志,您可能会看到错误代码 0x80004005。如果您尝试从命令提示符运行 dotnet.exe 以在该服务器上加载您的 asp.net 核心应用程序 dll,您可能会看到类似“BadImageFormatException”或“尝试加载格式不正确的程序”之类的错误。对我有用的解决方法是将 web.config 添加到我的项目(和部署)中,并在该 web.config 中设置 dotnet.exe 的 32 位版本的完整路径。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <location path="." inheritInChildApplications="false">
        <system.webServer>
            <handlers>
                <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
            </handlers>
            <aspNetCore processPath="C:\Program Files (x86)\dotnet\dotnet.exe" arguments=".\My32BitAspNetCoreApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
       </system.webServer>
   </location>
</configuration>

【讨论】:

【参考方案30】:

我遇到了同样的问题,我的原因是 EF 核心试图从 appsettings.development.json 文件中读取连接字符串。我打开它,发现连接字符串被注释了。

//
//  "ConnectionStrings": 
//    "DefaultConnection": "Server=vaio;Database=Goldentaurus;Trusted_Connection=True;",
//    "IdentityConnection": "Server=vaio;Database=GTIdentity;Trusted_Connection=True;"
//  
//

然后我像下面这样取消提交它们,问题就解决了:


  "ConnectionStrings": 
    "DefaultConnection": "Server=vaio;Database=Goldentaurus;Trusted_Connection=True;",
    "IdentityConnection": "Server=vaio;Database=GTIdentity;Trusted_Connection=True;"
  

【讨论】:

以上是关于IIS 错误 502.5 上的 ASP.NET Core 1.0的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 错误 502.5 - 升级到 ASP.NET Core 2.2 后 ANCM 进程外启动失败

IIS 10 上的 ASP.NET Core 404 错误

诊断 IIS 7 和 ASP.NET MVC 上的 404 错误

部署在 IIS 上的 ASP.NET Core 对长时间运行的请求返回 502 错误

ASP.NET 4.5 在 ASP.NET Core 2.0 应用程序下的 Azure Web App 中将 502.5 作为虚拟应用程序抛出

IIS 7.5 上的 ASP.NET MVC