【问题标题】:ASP.NET Core Error: System.TypeLoadException: Could not load type 'Microsoft.AspNetCore.WebUtilities.FileBufferingWriteStream'ASP.NET Core 错误:System.TypeLoadException:无法加载类型“Microsoft.AspNetCore.WebUtilities.FileBufferingWriteStream”
【发布时间】:2019-07-19 07:08:01
【问题描述】:

我创建了一个基于 ASP.NET Core 3 preview 6 的服务器,并尝试在基于 linux 的 docker 中运行它。任何请求我都会收到错误:“System.TypeLoadException:无法从程序集'Microsoft.AspNetCore.WebUtilities,Version = 3.0.0.0,Culture = Neutral,PublicKeyToken = adb9793829ddae60'加载类型'Microsoft.AspNetCore.WebUtilities.FileBufferingWriteStream'。”

在本地计算机(Windows Server 2012)上运行 Kestrel 时,对我来说一切正常。除了 AspNetCore 和 NewtonsoftJson,我不使用任何库。该项目是使用 Controller API 模板创建的。

项目.csproj:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
    <UserSecretsId>2bd64d79-ff97-4e47-8cbd-514aa4874416</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.0.0-preview6.19307.2" />
    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.7.12" />
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>

</Project>

Dockerfile:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-stretch AS build
WORKDIR /src
COPY ["DockerTest/DockerTest.csproj", "DockerTest/"]
RUN dotnet restore "DockerTest/DockerTest.csproj"
COPY . .
WORKDIR "/src/DockerTest"
RUN dotnet build "DockerTest.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "DockerTest.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "DockerTest.dll"]

控制器:

using Microsoft.AspNetCore.Mvc;

namespace DockerTest.Controllers
{
    [Route("api/[action]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values
        [HttpGet]
        public JsonResult Get()
        {
            return new JsonResult(new string[] { "value1", "value2" });
        }

        // GET api/values/5
        [HttpGet("{id}")]
        public ActionResult<string> Get(int id)
        {
            return "value";
        }

        // POST api/values
        [HttpPost]
        public void Post([FromBody] string value)
        {
        }

        // PUT api/values/5
        [HttpPut("{id}")]
        public void Put(int id, [FromBody] string value)
        {
        }

        // DELETE api/values/5
        [HttpDelete("{id}")]
        public void Delete(int id)
        {
        }
    }
}

Startup.cs:

// This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers()
                .AddNewtonsoftJson();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            //app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

错误:

Connection id "0HLOBGRFHMARF", Request id "0HLOBGRFHMARF:00000001": An unhandled exception was thrown by the application.
System.TypeLoadException: Could not load type 'Microsoft.AspNetCore.WebUtilities.FileBufferingWriteStream' from assembly 'Microsoft.AspNetCore.WebUtilities, Version=3.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.
at Microsoft.AspNetCore.Mvc.NewtonsoftJson.NewtonsoftJsonResultExecutor.ExecuteAsync(ActionContext context, JsonResult result)
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
at Microsoft.AspNetCore.Mvc.NewtonsoftJson.NewtonsoftJsonResultExecutor.ExecuteAsync(ActionContext context, JsonResult result)
at Microsoft.AspNetCore.Mvc.JsonResult.ExecuteResultAsync(ActionContext context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultAsync(IActionResult result)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeNextResultFilterAsync[TFilter,TFilterAsync]()
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContext context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeAsync()
at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)

我尝试启动一个基于 dotnet/core/aspnet:3.0.0-preview6 的 docker,但没有发现任何变化。

另外,据我了解,一些库已从 asp.net Core 3 中删除,包括 Microsoft.AspNetCore.WebUtilities。

我什至添加到项目中,但再次没有注意到差异

【问题讨论】:

  • 是否有任何演示可以重现您的问题?我尝试使用您的 dockerfile 和 .csproj 进行测试。它将无法构建。
  • @TaoZhou hub.docker.com/r/lifefreedom11/life/builds 查看a19b694(使用buster)和8ecc8a5(使用stretch-slim)提交源

标签: c# docker asp.net-core asp.net-core-3.0


【解决方案1】:

对于一个工作演示,尝试更改您的 dockerfile 以将 mcr.microsoft.com/dotnet/core/aspnet:3.0-stretch-slim 替换为 mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim 并将 mcr.microsoft.com/dotnet/core/sdk:3.0-stretch 替换为 mcr.microsoft.com/dotnet/core/sdk:3.0-buster

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
#FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
#FROM mcr.microsoft.com/dotnet/core/sdk:3.0-stretch AS build
WORKDIR /src

【讨论】:

  • 基于 mcr.microsoft.com/dotnet/core/aspnet:3.0-stretch-slim 的图像未在我的主机上启动,原因是图像不受支持。在这个场合,我已经写了支持托管。
  • 我能够运行基于 mcr.microsoft.com/dotnet/core/aspnet:3.0-alpine 的 docker。我不太了解它们之间的区别,也许你知道?
  • @LIFEfreedom 你确定你在linux docker容器下运行吗?
  • @LIFEfreedom 你可以看看这个ASP.NET Core Runtime
  • FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim 的问题与 Docker 容器支持的发行版有关(docs.jelastic.com/docker-supported-分布)。 Jelastic 不支持 Debian 10
猜你喜欢
  • 2019-02-21
  • 1970-01-01
  • 2020-09-28
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
相关资源
最近更新 更多