首页 > 解决方案 > 如何在 linx docker 容器上部署 aspnet 核心应用程序而不会出现 404 错误

问题描述

我有一个 ASPNET Core 5.0 Web api 应用程序在 Windows 本地成功运行,但在部署到 linux 服务器上托管的 linux docker 容器时失败。导航到http://internal.apps.talquinelectric.com/is/api时页面不会加载。我收到 404 错误。

启动设置.json

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:80",
      "sslPort": 80
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "FixBatchAPI": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "http://internal.apps.talquinelectric.com/is/api",
      "applicationUrl": "http://internal.apps.talquinelectric.com/is/api",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"
      }
    }
  }
}

启动.cs

// 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();
                app.UseSwagger();
                app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "FixBatchAPI v1"));
            }

            //app.UseHttpsRedirection();
                        
            app.UseRouting();

            app.UseAuthorization();

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

Dockerfile

# syntax=docker/dockerfile:1
  FROM mcr.microsoft.com/dotnet/aspnet:5.0
  COPY FixBatchAPI/net50/ App/
  WORKDIR /App
  ENTRYPOINT ["dotnet", "FixBatchAPI.dll"]

码头工人-compose.yml

version: "3"

services:
   fixbatch-api:
      image: "fixbatch-api-build:latest"
      container_name: "fixbatch-api"
      networks:
        - traefix_proxy
      labels:
        - "traefik.enable=true"
        - "traefik.docker.network=traefik_proxy"
 
        - "traefik.http.routers.fixbatch-api.entrypoint=https"
        - "traefik.http.routers.fixbatch-api.tls=true"
        - "traefik.http.routers.fixbatch-api.rule=Host(`internal.apps.talquinelectric.com`) && PathPrefix(`/is/api`)"
        - "traefik.http.services.fixbatch-api-service.loadbalancer.server.port=80"
        - "traefik.http.middlewares.fixbatch-api-middlewares.chain.middlewares=fixbatch-api-strip"
        - "traefik.http.middlewares.fixbatch-api-strip.stripprefix.prefixes=/is/api"

        - "traefik.http.routers.fixbatch-api-http.entrypoint=http"
        - "traefik.http.routers.fixbatch-api-http.rule=Host(`internal.apps.talquinelectric.com`) && PathPrefix(`/is/api`)"
        - "traefik.http.middlewares.fixbatch-api-redirect-https.redirectscheme.scheme=https"
        - "traefik.http.routers.fixbatch-api-http.middlewares=fixbatch-api-redirect-https"

        - "traefik.http.middlewares.cors.headers.accesscontrolallowmethods=GET,OPTIONS,PUT"
        - "traefik.http.middlewares.cors.headers.accesscontrolalloworigin=*"
        - "traefik.http.middlewares.cors.headers.addvaryheader=true"

networks:
   traefik_proxy:
      external: true
   default:
      external: false

docker-compose 日志的结果:

码头工人撰写日志

在浏览器中查看时得到的结果:

浏览器渲染 404 响应

标签: dockerasp.net-corekestrel

解决方案


添加如下代码,即可打开 swaggerui 页面。

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
    app.UseSwagger();
    app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "FixBatchAPI v1"));
} 
// default, no below code
else {
    app.UseSwagger();
    app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "FixBatchAPI v1"));
}

推荐阅读