Я только что обновился до ASP.NET Core 3 Preview 5, теперь, когда я открываю свое решение и пытаюсь собрать его, возникает ошибка «Нет перегрузки для метода UseRouting, который принимает 1 аргумент» в файле Startup.cs в Configure() в следующем коде:
app.UseRouting(routes => {
routes.MapControllerRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapRazorPages();
});
Я прочитал некоторую документацию по документам Microsoft и попытался заменить приведенный выше код на:
app.UseEndpoints(endpoints => {
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
Однако во время сборки возникает исключение System.InvalidOperationException со следующим контекстом:
'EndpointRoutingMiddleware matches endpoints setup by EndpointMiddleware and so must be added to the request execution pipeline before EndpointMiddleware. Please add EndpointRoutingMiddleware by calling 'IApplicationBuilder.UseRouting' inside the call to 'Configure(...)' in the application startup code.'
Я попытался заменить следующую строку в методе ConfigureServices:
services.AddMvc()
.AddNewtonsoftJson();
ширина:
services.AddControllersWithViews()
.AddNewtonsoftJson();
services.AddRazorPages();
Это больше не вызывает ошибок, но моя страница пуста, когда она заканчивает загрузку. Кто может помочь мне решить эту проблему?
Для моего решения я использую следующие пакеты:
<PackageReference Include = "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version = "3.0.0-preview5-19227-01" />
<PackageReference Include = "Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version = "3.0.0-preview5-19227-01" />
<PackageReference Include = "Microsoft.AspNetCore.Identity.UI" Version = "3.0.0-preview5-19227-01" />
<PackageReference Include = "Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version = "3.0.0-preview5-19227-01" />
<PackageReference Include = "Microsoft.EntityFrameworkCore.SqlServer" Version = "3.0.0-preview5.19227.1" />
<PackageReference Include = "Microsoft.EntityFrameworkCore.Tools" Version = "3.0.0-preview5.19227.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include = "Microsoft.Extensions.Logging.Debug" Version = "3.0.0-preview5.19227.9" />
<PackageReference Include = "Microsoft.VisualStudio.Web.CodeGeneration.Design" Version = "2.2.3" />
TargetFramework моего решения — netcoreapp3.0.
Немного покопавшись, я нашел решение этой проблемы. Поскольку dotnet core 3.0 требует некоторых дополнительных действий, я объясню, что я сделал, чтобы это заработало. Во-первых, в методе ConfigureServices() (в Startup.cs) удалите:
services.AddMvc().AddNewtonsoftJson();
В верхней части этого метода (в разделе services.Configure<>) добавьте следующие строки:
services.AddControllersWithViews()
.AddNewtonsoftJson();
services.AddRazorPages();
Затем в методе Configure() добавьте app.UseRouting()
перед app.UseAuthentication()
и app.UseAuthorization();
и в нижней части этого метода замените
app.UseRouting(routes => {
routes.MapControllerRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapRazorPages();
});
с участием:
app.UseEndpoints(endpoints => {
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
Чтобы снова процитировать сообщение об ошибке:
EndpointRoutingMiddleware
matches endpoints setup byEndpointMiddleware
and so must be added to the request execution pipeline beforeEndpointMiddleware
. Please addEndpointRoutingMiddleware
by calling 'IApplicationBuilder.UseRouting
' inside the call to 'Configure(...)
' in the application startup code.
ASP.NET Core 3 использует усовершенствованный маршрутизация конечной точки, который обычно дает больше контроля над маршрутизацией внутри приложения. Маршрутизация конечных точек работает в два отдельных этапа:
Это два отдельных шага, позволяющие другим промежуточным программам действовать между этими точками. Это позволяет этим промежуточным программам использовать информацию из маршрутизации конечных точек, например. для обработки авторизации без необходимости выполнения как части фактического обработчик (например, MVC).
Два шага устанавливаются app.UseRouting()
и app.UseEndpoints()
. Первый зарегистрирует промежуточное ПО, которое запускает логику для определения маршрута. Последний затем выполнит этот маршрут.
Если вы внимательно прочитаете сообщение об ошибке, между несколько запутанным использованием EndpointRoutingMiddleware
и EndpointMiddleware
вам будет предложено добавить UseRouting()
внутрь метода Configure
. Таким образом, вы забыли вызвать первый шаг маршрутизации конечной точки.
Итак, ваш Configure
должен (например) выглядеть так:
app.UseRouting();
app.UseAuthentication();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
Миграция маршрутизации на версию 3.0 также описана в руководство по миграции на 3.0.