Для получения логов запросов к 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)
Для использования с .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"
}
});
Для работы ` 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 много оптимизаций из-за которых часто возникает ситуация когда запрос не может быть преобразован в 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 нормально десериализовал необходимо добавить пакет Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson
на сервере надо добавить
services.AddSignalR()
.AddNewtonsoftJsonProtocol();