相同的 Web API 代码适用于 Windows 10,但不适用于 Linux Debian Buster

Posted

技术标签:

【中文标题】相同的 Web API 代码适用于 Windows 10,但不适用于 Linux Debian Buster【英文标题】:The same Web API Code works on Windows 10 but not on Linux Debian Buster 【发布时间】:2021-08-15 05:47:36 【问题描述】:

在下面的屏幕截图中,我的 Web API 在 Windows 10(左)上使用 .NET5.0 运行,在 Linux Debian Buster(右)(WSL2)上使用 .NET(核心?)5.0 运行相同的 Web API。

如您所见,在 Windows 上它可以正确映射控制器,但在 Linux 上却不行。我将 Swagger 页面显示得更加明确,但如果我手动访问路由,行为是相同的。

有谁知道可能是什么以及如何解决这个问题?我必须让它在 Linux 上运行,因为我的部署目标是基于 debian 的服务器。

以下是一些可能有用的代码(Startup.cs 和 Controller 声明)

Startup.cs

    public void ConfigureServices(IServiceCollection services)
    

        services.AddControllers();
        services.AddDbContext<Core.Contexts.ComiesContext>(o => o.UseSqlServer("name=LocalComiesDBConn"); o.ConfigureWarnings(p => p. Ignore(30000)););
        services.AddSwaggerGen(c => c.SwaggerDoc("v1", new OpenApiInfo  Title = "comies_services", Version = "v1" ));
        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<Core.Contexts.ComiesContext>()
            .AddDefaultTokenProviders();

        var signingConfigurations = new Structures.ModelsConfigurations.SigningConfigurations(Configuration["TokenConfigurations:securityKey"]);
        services.AddSingleton(signingConfigurations);

        var tokenConfigurations = new AuthenticationConfiguration();
        new ConfigureFromConfigurationOptions<AuthenticationConfiguration>(Configuration.GetSection("TokenConfigurations")).Configure(tokenConfigurations);
        services.AddSingleton(tokenConfigurations);

        services.AddAuthentication(authOptions =>
        
            authOptions.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            authOptions.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

        ).AddJwtBearer(jwtBearerOptions =>
        
            var paramsValidation = jwtBearerOptions.TokenValidationParameters;

            paramsValidation.IssuerSigningKey = signingConfigurations.Key;
            paramsValidation.ValidAudience = tokenConfigurations.Audience;
            paramsValidation.ValidIssuer = tokenConfigurations.Issuer;

            paramsValidation.ValidateIssuerSigningKey = true;

            paramsValidation.ValidateLifetime = true;

            paramsValidation.ClockSkew = TimeSpan.Zero;
        );

        // Ativa o uso do token como forma de autorizar o acesso
        // a recursos deste projeto
        services.AddAuthorization(auth =>
        
            
            auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
                .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
                .RequireAuthenticatedUser().Build());
        );


        services.AddScoped<AuthenticatedOperator>();
        services.AddScoped<AuthenticationService>();
        services.AddTransient<UserManager<ApplicationUser>>();
        services.AddTransient<SignInManager<ApplicationUser>>();
    

    // 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", "comies_services v1"));
        

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthorization();

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

AuthController.cs

[Route("api/v1/auth")]
[ApiController]
public class AuthenticationController : ControllerBase

    private readonly ComiesContext _context;

    private readonly AuthenticationService _authenticationService;

    public AuthenticationController(ComiesContext context, AuthenticationService authenticationService)
    
        _context = context; _authenticationService = authenticationService;
    


    // GET: api/<AuthenticationController>
    [HttpGet("register/template")]
    public async Task<ActionResult<Store>> Get()
    
        ///hidden implementation, but trust me, this endpoint is working (when it's mapped)
    

【问题讨论】:

【参考方案1】:

我已经使用您发布的控制器制作了一个示例项目,但我无法重现该行为。它正在工作,没有问题。

尝试检查 Swagger 版本,应该在 5.6.3 以上

   <PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" />

【讨论】:

是的。问题实际上不是 Swagger,我只是向大家展示了控制器是如何映射(或未映射)的。但是,如果我导航到路线本身,它也会返回 404,所有 em 可能是和https有关?尝试像这里一样设置 https thegreenerman.medium.com/…

以上是关于相同的 Web API 代码适用于 Windows 10,但不适用于 Linux Debian Buster的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 MediaSource 适用于某些 mp4 文件,而不适用于其他文件(相同的编解码器)

OpenGL 代码适用于 Windows 但不适用于 Mac

适用于移动设备和 Web 的安全 API

适用于 Windows 运行时应用的 Win32 和 COM API(系统)

适用于 Windows 8 应用商店 Web 资源的 Worklight 加密

是否有适用于 Windows Vista/7/8 的新 Midi API?