【问题标题】:Upgraded to ASP.NET Core 3.1, getting error about System.Text.Json升级到 ASP.NET Core 3.1,收到有关 System.Text.Json 的错误
【发布时间】:2019-12-17 14:00:52
【问题描述】:

我最近从 ASP.NET Core 2.2 升级到了 ASP.NET Core 3.1。在本地,一切似乎都正常,但是在部署到 IIS 时我遇到了问题。我在事件查看器中收到的错误是

Application: w3wp.exe
CoreCLR Version: 4.700.19.56402
.NET Core Version: 2.2.4
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.FileNotFoundException: Could not load file or assembly 'System.Text.Json, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
File name: 'System.Text.Json, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
   at Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider.Load(Stream stream)
   at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload)
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.Extensions.Configuration.FileConfigurationProvider.HandleException(ExceptionDispatchInfo info)
   at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload)
   at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load()
   at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
   at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
   at Microsoft.Extensions.Hosting.HostBuilder.BuildAppConfiguration()
   at Microsoft.Extensions.Hosting.HostBuilder.Build()
   at <AppName>.Program.Main(String[] args)

这很奇怪,因为此错误消息表明它使用的是 .NET Core 版本 2.2.4。我已经安装了 .NET Core 3.1 托管包并重新启动了服务器。

我浏览了this post 中的故障排除提示,发现:

  • 当尝试从命令行运行应用程序时(同时运行 dotnet &lt;AppName&gt;.dll&lt;AppName&gt;.exe ,我得到与在事件查看器中完全相同的错误。
  • 我在 web.config 中启用了 stdoutLog。目录已创建,但没有写入日志文件。
  • 我已启用 ASP.NET Core 模块调试日志:
[aspnetcorev2.dll] Resolving hostfxr parameters for application: 'dotnet' arguments: '.\<AppName>.dll' path: 'C:\inetpub\wwwroot\<AppName>\'
[aspnetcorev2.dll] Known dotnet.exe location: ''
[aspnetcorev2.dll] Process path 'dotnet.exe' is dotnet, treating application as portable
[aspnetcorev2.dll] Resolving absolute path to dotnet.exe from 'dotnet.exe'
[aspnetcorev2.dll] Invoking where.exe to find dotnet.exe
[aspnetcorev2.dll] where.exe invocation returned: 'C:\Program Files\dotnet\dotnet.exe
C:\Program Files (x86)\dotnet\dotnet.exe
'
[aspnetcorev2.dll] Current process bitness type detected as isX64=1
[aspnetcorev2.dll] Processing entry 'C:\Program Files\dotnet\dotnet.exe'
[aspnetcorev2.dll] Binary type 6
[aspnetcorev2.dll] Found dotnet.exe via where.exe invocation at 'C:\Program Files\dotnet\dotnet.exe'
[aspnetcorev2.dll] Resolving absolute path to hostfxr.dll from 'C:\Program Files\dotnet\dotnet.exe'
[aspnetcorev2.dll] hostfxr.dll located at 'C:\Program Files\dotnet\host\fxr\3.1.0\hostfxr.dll'
[aspnetcorev2.dll] Converted argument '.\<AppName>.dll' to 'C:\inetpub\wwwroot\<AppName>\.\<AppName>.dll'
[aspnetcorev2.dll] Parsed hostfxr options: dotnet location: 'C:\Program Files\dotnet\dotnet.exe' hostfxr path: 'C:\Program Files\dotnet\host\fxr\3.1.0\hostfxr.dll' arguments:
[aspnetcorev2.dll] Argument[0] = 'C:\Program Files\dotnet\dotnet.exe'
[aspnetcorev2.dll] Argument[1] = 'C:\inetpub\wwwroot\<AppName>\.\<AppName>.dll'
[aspnetcorev2.dll] Loading hostfxr from location C:\Program Files\dotnet\host\fxr\3.1.0\hostfxr.dll
[aspnetcorev2.dll] Canceling standard stream pipe reader
[aspnetcorev2.dll] Loading request handler:  'C:\inetpub\wwwroot\<AppName>\aspnetcorev2_inprocess.dll'
[aspnetcorev2.dll] Creating handler application
[aspnetcorev2_inprocess.dll] Initializing logs for 'C:\inetpub\wwwroot\<AppName>\aspnetcorev2_inprocess.dll'. Process Id: 4100.. File Version: 13.1.19320.0. Description: IIS ASP.NET Core Module V2 Request Handler. Commit: 2b7e994b8a304700a09617ffc5052f0d943bbcba.
[aspnetcorev2_inprocess.dll] Waiting for initialization
[aspnetcorev2_inprocess.dll] Starting in-process worker thread
[aspnetcorev2_inprocess.dll] Resolving hostfxr parameters for application: 'dotnet' arguments: '.\<AppName>.dll' path: 'C:\inetpub\wwwroot\<AppName>\'
[aspnetcorev2_inprocess.dll] Known dotnet.exe location: 'C:\Program Files\dotnet\dotnet.exe'
[aspnetcorev2_inprocess.dll] Process path 'dotnet.exe' is dotnet, treating application as portable
[aspnetcorev2_inprocess.dll] Resolving absolute path to hostfxr.dll from 'C:\Program Files\dotnet\dotnet.exe'
[aspnetcorev2_inprocess.dll] hostfxr.dll located at 'C:\Program Files\dotnet\host\fxr\3.1.0\hostfxr.dll'
[aspnetcorev2_inprocess.dll] Converted argument '.\<AppName>.dll' to 'C:\inetpub\wwwroot\<AppName>\.\<AppName>.dll'
[aspnetcorev2_inprocess.dll] Parsed hostfxr options: dotnet location: 'C:\Program Files\dotnet\dotnet.exe' hostfxr path: 'C:\Program Files\dotnet\host\fxr\3.1.0\hostfxr.dll' arguments:
[aspnetcorev2_inprocess.dll] Argument[0] = 'C:\Program Files\dotnet\dotnet.exe'
[aspnetcorev2_inprocess.dll] Argument[1] = 'C:\inetpub\wwwroot\<AppName>\.\<AppName>.dll'
[aspnetcorev2_inprocess.dll] Setting environment variable ASPNETCORE_IIS_HTTPAUTH=anonymous;
[aspnetcorev2_inprocess.dll] Setting environment variable ASPNETCORE_IIS_PHYSICAL_PATH=C:\inetpub\wwwroot\<AppName>\
[aspnetcorev2_inprocess.dll] Loading hostfxr from location C:\Program Files\dotnet\host\fxr\3.1.0\hostfxr.dll
[aspnetcorev2_inprocess.dll] Initial Dll directory: '', current directory: 'c:\windows\system32\inetsrv'
[aspnetcorev2_inprocess.dll] Setting dll directory to c:\windows\system32\inetsrv
[aspnetcorev2_inprocess.dll] Setting current directory to C:\inetpub\wwwroot\<AppName>\
[aspnetcorev2_inprocess.dll] Event Log: 'Application '/LM/W3SVC/1/ROOT/<AppName>' with physical root 'C:\inetpub\wwwroot\<AppName>\' failed to load coreclr. Exception message:
Error occured when initializing inprocess application, Return code: 0x80008083' 
End Event Log Message.
[aspnetcorev2_inprocess.dll] InvalidOperationException 'Error occured when initializing inprocess application, Return code: 0x80008083' caught at F:\workspace\_work\1\s\src\Servers\IIS\AspNetCoreModuleV2\InProcessRequestHandler\inprocessapplication.cpp:346 
[aspnetcorev2_inprocess.dll] Stopping in-process worker thread
[aspnetcorev2_inprocess.dll] Stopping CLR
[aspnetcorev2_inprocess.dll] Event Log: 'Application '/LM/W3SVC/1/ROOT/<AppName>' with physical root 'C:\inetpub\wwwroot\<AppName>\' failed to load coreclr. Exception message:
CLR worker thread exited prematurely' 
End Event Log Message.
[aspnetcorev2_inprocess.dll] InvalidOperationException 'CLR worker thread exited prematurely' caught at F:\workspace\_work\1\s\src\Servers\IIS\AspNetCoreModuleV2\InProcessRequestHandler\inprocessapplication.cpp:407 
[aspnetcorev2_inprocess.dll] Failed HRESULT returned: 0x8007023e at F:\workspace\_work\1\s\src\Servers\IIS\AspNetCoreModuleV2\InProcessRequestHandler\dllmain.cpp:131 
[aspnetcorev2_inprocess.dll] Starting app_offline monitoring in application 'C:\inetpub\wwwroot\<AppName>\'
[aspnetcorev2_inprocess.dll] Starting file watcher thread

这是我的 Program.cs:

public static void Main(string[] args)
{
    Directory.SetCurrentDirectory(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
    XmlDocument log4netConfig = new XmlDocument();
    log4netConfig.Load(File.OpenRead("log4net.config"));
    ILoggerRepository repo = log4net.LogManager.CreateRepository(
        Assembly.GetEntryAssembly(),
        typeof(log4net.Repository.Hierarchy.Hierarchy));
    log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);

    CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseIIS();
        webBuilder.UseStartup<Startup>();
    });

这是我的 Startup.cs 的重要部分

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();
    services.AddScoped<INotifyService, NotifyService>();
    services.AddControllers().AddNewtonsoftJson();

    // Authentication and CORS settings

    services.AddSignalR().AddNewtonsoftJsonProtocol();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.ConfigureExceptionHandler();

    app.UseRouting();
    app.UseStaticFiles();
    app.UseCors("CorsPolicy");

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseHttpsRedirection();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<NotifyHub>("/notify");
        endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}");
    });
    app.UseDefaultFiles();
}

我认为事件查看器错误中的 .NET Core 版本是关键,但我不知道如何强制它使用 3.1。

更新 - 添加 .csproj 文件信息

我的 .csproj 文件的相关部分是:

<PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <PropertyGroup>
    <RuntimeFrameworkVersion>3.1.0</RuntimeFrameworkVersion>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  </PropertyGroup>

【问题讨论】:

  • 您是如何部署应用程序的?从 3.1 开始,我在部署时遇到了类似的问题。不知何故,我首先需要手动删除项目中的所有 bin/obj 文件夹,然后重做部署。可以试试吗?
  • 谢谢@gsharp。由于时间限制,我现在不得不回滚到 .NET Core 的升级,但肯定会很快尝试

标签: asp.net-core


【解决方案1】:

解决自 Visual Studio 2002 以来 90% 问题的技巧 ;-)

手动删除解决方案中的所有 bin 和 obj 文件夹。

【讨论】:

    【解决方案2】:

    您可以发布您的项目文件 (.csproj) 吗?

    您需要在所有项目文件中具有正确的属性。下面的 null 不是必需的,C# 8 也不是。但必须在项目文件中指定 3.1。

    这是我在当前核心 3.1 项目中使用的设置:

      <PropertyGroup>
          <TargetFramework>netcoreapp3.1</TargetFramework>
          <LangVersion>8.0</LangVersion>
          <Nullable>enable</Nullable>
          <NullableContextOptions>enable</NullableContextOptions>
      </PropertyGroup>
    

    【讨论】:

    • 感谢您的回复。我已经用我的 .csproj 文件的相关部分更新了这个问题。 TargetFramework 和 RuntimeFrameworkVersion 设置为 3.1
    猜你喜欢
    • 2020-12-03
    • 2021-02-26
    • 1970-01-01
    • 2021-10-13
    • 2021-08-09
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2018-01-28
    相关资源
    最近更新 更多