/
ArtSerg
/
IntegrationProject
Обзор
Документация
Войти
/
ArtSerg
/
IntegrationProject
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
lab4
Integration1/Program.cs
141 строка
4 KB
artS3rg
Добавлена интеграция RabbitMQ для асинхронного обмена сообщениями
14 дек 2025, 21:50
14 дек 2025, 21:50
a02de12
Код
Авторство
О чём код?
using Integration1.Data; using Integration1.Services; using Integration1.Swagger; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using System.Text; using Integration1; // Проверяем, нужно ли запустить тесты if (args.Length > 0 && args[0] == "test") { await TestRabbitMQ.RunTests(); return; } var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext<AppDbContext>(opt => opt.UseSqlite("Data Source=tasks.db")); builder.Services.AddScoped<JwtService>(); builder.Services.AddSingleton<RabbitMQService>(); builder.Services.AddScoped<MessageHandlerService>(); builder.Services.AddControllers(); builder.Services.AddMemoryCache(); builder.Services.AddCors(options => { options.AddDefaultPolicy(policy => { policy.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }); }); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Task API v1", Version = "v1" }); c.SwaggerDoc("v2", new OpenApiInfo { Title = "Task API v2", Version = "v2" }); c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { In = ParameterLocation.Header, Description = "Input JWT", Name = "Authorization", Type = SecuritySchemeType.Http, Scheme = "bearer", BearerFormat = "JWT" }); c.AddSecurityDefinition("InternalApiKey", new OpenApiSecurityScheme { In = ParameterLocation.Header, Description = "X-Internal-ApiKey", Name = "X-Internal-ApiKey", Type = SecuritySchemeType.ApiKey }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, new string[] {} } }); c.OperationFilter<InternalApiKeyOperationFilter>(); c.OperationFilter<IdempotencyHeaderOperationFilter>(); }); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(opt => { opt.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = true, ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]!)) }; }); var app = builder.Build(); app.UseMiddleware<RateLimitMiddleware>(); app.UseMiddleware<IdempotencyMiddleware>(); app.UseCors(); app.UseAuthentication(); app.UseAuthorization(); app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "v1"); c.SwaggerEndpoint("/swagger/v2/swagger.json", "v2"); }); app.MapControllers(); using (var scope = app.Services.CreateScope()) { var db = scope.ServiceProvider.GetRequiredService<AppDbContext>(); db.Database.Migrate(); } // Запускаем обработчик RabbitMQ сообщений try { var rabbitMQService = app.Services.GetRequiredService<RabbitMQService>(); rabbitMQService.StartConsuming(async (request) => { using var scope = app.Services.CreateScope(); var messageHandlerService = scope.ServiceProvider.GetRequiredService<MessageHandlerService>(); return await messageHandlerService.HandleMessage(request); }); Console.WriteLine("RabbitMQ message handler started successfully."); } catch (Exception ex) { Console.WriteLine($"ERROR: Failed to start RabbitMQ handler: {ex.Message}"); Console.WriteLine("Make sure RabbitMQ is running. You can start it with: docker-compose up -d"); Console.WriteLine("Or manually: docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management"); // Приложение продолжит работать, но RabbitMQ функциональность будет недоступна } app.Run();