Я перевожу некоторые внутренние проекты с NET Core 2.0 на 3.0, и у меня возникают проблемы с выполнением контроллера после завершения промежуточного программного обеспечения. Честно говоря, я немного разочарован тем, что похожий подход используется для работы с NET Core 2.0.
Я загрузил свой тестовый проект в GitHub: https://github.com/wonea/MVC-API-Routing-Test
В тестовом проекте подробно описаны три промежуточных ПОэтапы;SecurityMiddleware, UserValidatorMiddleware, WebSocketMiddleware. Таким образом, при загрузке API вы можете установить точки останова на каждом из отдельных этапов, и они будут отображаться в правильном порядке. Однако после передачи HTTPContext на заключительном этапе промежуточного программного обеспечения он возвращается, но не попадает в контроллер.
В Startup.cs я настраиваю свои службы:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddApplicationInsightsTelemetry(_configuration);
// memory cache
services.AddMemoryCache();
services.AddMvc()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
options.JsonSerializerOptions.IgnoreNullValues = true;
})
.SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
// CORS
var corsBuilder = new CorsPolicyBuilder();
services.AddCors(builder =>
{
corsBuilder.AllowAnyHeader();
corsBuilder.AllowAnyMethod();
corsBuilder.AllowAnyOrigin();
corsBuilder.WithOrigins("*");
corsBuilder.AllowCredentials();
});
}
Я подробно описал конвейер запросов, настройка WebSockets, выполнение промежуточного программного обеспечения, а затем запуск моего контроллера в качестве конечной точки.
public void Configure(IApplicationBuilder app, IHostApplicationLifetime appLifetime)
{
appLifetime.ApplicationStarted.Register(OnStarted);
appLifetime.ApplicationStopping.Register(OnStopping);
appLifetime.ApplicationStopped.Register(OnStopped);
Console.CancelKeyPress += (sender, eventArgs) =>
{
appLifetime.StopApplication();
// Don't terminate the process immediately, wait for the Main thread to exit gracefully.
eventArgs.Cancel = true;
};
app.UseRouting();
app.UseSecurityMiddleware();
app.UseUserValidation();
// websockets
var webSocketOptions = new WebSocketOptions
{
KeepAliveInterval = TimeSpan.FromSeconds(120)
};
app.UseWebSockets(webSocketOptions);
app.UseWebSocketMiddleware();
// put last so header configs like CORS or Cookies etc can fire
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Мне понадобится только один контроллер, поэтому мне не нужна какая-либо необычная конфигурация.