.NET API部署至Railway后无法访问,请求返回405错误
.NET API部署至Railway平台遇到405错误及部署失败问题
Heroku停止免费服务后,我将开发的.NET API部署到Railway平台,但遇到访问问题:
- 通过Dockerfile部署时,流程显示成功,但使用Railway生成的域名访问API,Postman发起请求返回405 Method Not Allowed错误
- 尝试不使用Dockerfile直接部署,同样失败
Program.cs代码
using Aplicacao.Interfaces; using Aplicacao.Services; using Dominio.Mensagem; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using Repositorio.Interfaces; using Repositorio.Repositories; using System.Text; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Configuration.AddUserSecrets<Program>(); builder.Configuration.AddKeyPerFile(directoryPath: "/run/secrets", optional: true); builder.Services.AddControllers(); builder.Services.AddSingleton<ConexaoBanco>(); builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); builder.Services.Configure<ApiBehaviorOptions>(options => { options.SuppressModelStateInvalidFilter = true; }); builder.Services.AddCors(options => { options.AddPolicy("CorsPolicy", builder => builder .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader()); }); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "ApiLoginUsuario", Version = "1.0" }); c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme() { Name = "Authorization", Type = SecuritySchemeType.ApiKey, Scheme = "Bearer", BearerFormat = "JWT", In = ParameterLocation.Header, Description = "JWT Authorization header using the Bearer scheme.", }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, new string[] {} } }); ; }); builder.Services.AddScoped<IMensagem, Mensagem>(); builder.Services.AddScoped<IUserService, UserService>(); builder.Services.AddScoped<IUsuarioRepository, UsuarioRepository>(); builder.Services.AddScoped<ITokenService, TokenService>(); builder.Services.AddTransient<IEmailService, EmailService>(); var tokenDecriptor = builder.Configuration["Secrets:TokenKey"]; Console.WriteLine(tokenDecriptor); var key = Encoding.ASCII.GetBytes(tokenDecriptor); builder.Services.AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(x => { x.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = false, ValidateAudience = false }; }); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseHttpsRedirection(); app.UseCors("CorsPolicy"); app.MapControllers(); app.Run();
Dockerfile内容
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 7028 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["ApiLoginUsuario/ApiLoginUsuario.csproj", "ApiLoginUsuario/"] COPY ["Aplicacao/Aplicacao.csproj", "Aplicacao/"] COPY ["Repositorio/Repositorio.csproj", "Repositorio/"] COPY ["Dominio/Dominio.csproj", "Dominio/"] RUN dotnet restore "ApiLoginUsuario/ApiLoginUsuario.csproj" COPY . . WORKDIR "/src/ApiLoginUsuario" RUN dotnet build "ApiLoginUsuario.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "ApiLoginUsuario.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . RUN rm -rf /app/build ENTRYPOINT ["dotnet", "ApiLoginUsuario.dll"]
相关截图说明
- 部署日志:显示部署流程执行成功
- 访问域名结果:请求返回405 Method Not Allowed错误
内容的提问来源于stack exchange,提问作者Marcus Vinicius
相关产品推荐
相关产品推荐

