Swagger не работает внутри Docker в основном проекте .Net? - PullRequest
0 голосов
/ 23 октября 2019

сетевое ядро ​​веб-API-приложения. Я создал чванство с проверкой подлинности Azure AD. Мой чванец работает правильно, когда я использую IIS. Когда я запускаю с помощью Docker, я получаю Этот сайт не может быть достигнуто. Ниже приведен мой код запуска.

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        azureActiveDirectoryOptions = configuration.GetSection("AzureAd").Get<AzureActiveDirectoryOptions>();
        swaggerUIOptions = configuration.GetSection("Swagger").Get<SwaggerUIOptions>();
    }

    public IConfiguration Configuration { get; }

    private readonly AzureActiveDirectoryOptions azureActiveDirectoryOptions;
    private readonly SwaggerUIOptions swaggerUIOptions;
    //
    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services
           .AddAuthentication(o =>
           {
               o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;

           })
           .AddJwtBearer(o =>
           {
               o.Authority = azureActiveDirectoryOptions.Authority;

               o.TokenValidationParameters = new TokenValidationParameters
               {

                   ValidAudiences = new List<string>
                   {
                      azureActiveDirectoryOptions.AppIdUri,
                      azureActiveDirectoryOptions.ClientId
                   },
                   ValidateIssuer = true,
                   ValidateAudience = true,
                   ValidIssuer = "https://KmartAus.onmicrosoft.com/oauth2/default",
                   RoleClaimType = ClaimTypes.Role
               };
           });

        services.AddMvc(options =>
        {

            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1); ;

        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });

            c.AddSecurityDefinition("oauth2", new OAuth2Scheme
            {
                Type = "oauth2",
                Flow = "implicit",
                AuthorizationUrl = swaggerUIOptions.AuthorizationUrl,
                TokenUrl = swaggerUIOptions.TokenUrl,
                Scopes = new Dictionary<string, string>
                {
                    {"Read", "13269k8-a2ea-45a1-96e7-6580f57b6e30/.default" }
                }
            });
            c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>>
            {
                    { "oauth2", new[] { "readAccess", "writeAccess" } }
            });
        });


    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }
        app.UseSwagger();
        app.UseSwaggerUI(c =>
        {

            c.OAuthClientId(swaggerUIOptions.ClientId);
            c.OAuthClientSecret(swaggerUIOptions.ClientSecret);
            c.OAuthRealm(azureActiveDirectoryOptions.ClientId);
            c.OAuthAppName("Swagger");
            //c.OAuthAdditionalQueryStringParams(new { resource = azureActiveDirectoryOptions.ClientId });
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
        });
        app.UseAuthentication();
        app.UseMvc();
    }
}

Ниже приведен файл Docker.

FROM microsoft/dotnet:2.1-sdk AS build
ENV ASPNETCORE_URLS http://*:44319
EXPOSE 44319
WORKDIR /src
COPY ["LocationServicesAPI/LocationServicesAPI.csproj", "LocationServicesAPI/"]
RUN dotnet restore "LocationServicesAPI/LocationServicesAPI.csproj"

COPY . .
WORKDIR /src/LocationServicesAPI/


RUN dotnet build LocationServicesAPI.csproj -c Release -o /app

ENTRYPOINT ["dotnet", "LocationServicesAPI.dll"]

Когда я нажимаю «Выполнить» в Docker, в браузере запускается http://localhost:54330/, и если я нажимаюhttp://localhost:54330/swagger/index.html ничего не открывается. Если я пытаюсь нажать http://localhost:44319/swagger/index.html, то я также не могу открыть чванство. Ниже приведено сопоставление портов моего контейнера, когда я выполняю докер ps.

44319 / tcp, 0.0.0.0:54330->80/tcp Ниже контейнера существуют файлы внутри контейнера.

Controllers  Dockerfile  LocationServicesAPI.csproj  LocationServicesAPI.csproj.user  Models  Program.cs  Properties  Startup.cs  appsettings.Development.json  appsettings.json  bin  obj  out  wwwroot

Может кто-нибудь помочь мне разобраться в проблеме? Любая помощь будет оценена. Спасибо

...