Radiofisik

my knowledge base

Обновление на .Net Core 3

Использование внутреннего API

Для получения логов запросов к API использовалось Middleware для логирования https://radiofisik.ru/2019/07/04/logging/ В нем вызывался метод

request.EnableRewind();

который находится в internal пространстве и в новом API отсутствует. что приводит к ошибке, которую можно решить заменив его на метод

request.EnableBuffering();

Сериализация

для сериализации раннее использовалась конструкция вида

services.AddMvcCore()
                    .AddJsonFormatters()
                    .AddJsonOptions(options => options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc)

сейчас аналогичного поведения можно достичь добавив пакет Microsoft.AspNetCore.Mvc.NewtonsoftJson

services.AddMvcCore()
                .AddNewtonsoftJson(settings => settings.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc)

Swagger

Для использования с .net core 3.0 4 версия swashbuckle уже не подходит. Соответственно требуется обновление на

    <PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="5.0.0-rc4" />
    <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="5.0.0-rc4" />

После обновления полностью изменяется код, отвечающий за авторизацию на

 c.SwaggerDoc("v1", new OpenApiInfo()
            {

                Version = "v1",
                Title = "Web API",
                Description = "The API",
                Contact = new OpenApiContact()
                {
                    Name = "Radiofisik",
                    Email = "mail@radiofisik.ru",
                },
                License = new OpenApiLicense()
                {
                    Name = "License",
                }
            });

            c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
            {
                Type = SecuritySchemeType.OAuth2,
                Flows = new OpenApiOAuthFlows()
                {
                    Password = new OpenApiOAuthFlow()
                    {
                        TokenUrl = new Uri("/auth/connect/token", UriKind.Relative),
                        Scopes = new Dictionary<string, string>()
                        {
                        }
                    }
                }
            });

            c.AddSecurityRequirement(new OpenApiSecurityRequirement()
            {
                {
                    new OpenApiSecurityScheme
                    {
                        Reference = new OpenApiReference
                        {
                            Type = ReferenceType.SecurityScheme,
                            Id = "oauth2"
                        },
                    },
                    new List<string>()
                }
            });

Добавлять параметр в хедер через фильтр тоже стало несколько сложнее

 operation.Parameters.Add(new OpenApiParameter()
            {
                Name = "X-User-Param",
                Description = "param description",
                In = ParameterLocation.Header,
                Required = false,
                Schema = new OpenApiSchema()
                {
                    Type = "string"
                }
            });

MVC

Для работы ` app.UseMvc();` теперь необходимо

services.AddMvcCore()....   
.AddMvcOptions(options =>
                    {
                        options.EnableEndpointRouting = false;
                    })

если используются embedded хранение вьюшек подключать это надо по-другому

  .AddRazorRuntimeCompilation(options =>
                {
                    //Create an EmbeddedFileProvider for that assembly
                    var embeddedFileProvider = new EmbeddedFileProvider(
                        typeof(MvcAssemblyMarker).Assembly,
                        typeof(MvcAssemblyMarker).Namespace
                    );
                    options.FileProviders.Add(embeddedFileProvider);
                })

EF core

В EF core много оптимизаций из-за которых часто возникает ситуация когда запрос не может быть преобразован в SQL и при этом возникает ошибка.

Также изменилась конфигурация для

  builder.OwnsMany(
                x => x.Posts,
                cfg =>
                {
                    cfg.HasForeignKey(x => x.BlogId);
                    cfg.HasKey(x => new {x.BlogId, x.PostId});
                    cfg.ToTable($@"{nameof(Posts)}");
                }

на

builder.OwnsMany(
                x => x.Posts,
                cfg =>
                {
                    cfg.WithOwner().HasForeignKey(x => x.BlogId);
                    cfg.HasKey(x => new {x.BlogId, x.PostId});
                    cfg.ToTable($@"{nameof(Posts)}");
                }

SignalR

Для того чтобы SignalR нормально десериализовал необходимо добавить пакет Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson на сервере надо добавить

services.AddSignalR()
        .AddNewtonsoftJsonProtocol();