使用& # 39;UseMvc& # 39;在使用端点路由时不支持配置MVC

我有一只Asp。Net core 2.2项目。

最近,我把。net core 2.2版本改成了。net core 3.0 Preview 8。在这个更改之后,我看到这个警告消息:

使用'UseMvc'配置MVC时,使用端点不支持 路由。要继续使用“UseMvc”,请设置 “MvcOptions。EnableEndpointRouting = false”里面“ConfigureServices”。< / p >

我明白,通过设置EnableEndpointRouting为假,我可以解决这个问题,但我需要知道解决它的正确方法是什么,以及为什么端点路由不需要UseMvc()函数。

180392 次浏览

但我需要知道正确的解决方法是什么

一般来说,你应该使用EnableEndpointRouting而不是UseMvc,你可以参考更新路由启动代码来获得启用EnableEndpointRouting的详细步骤。

为什么端点路由不需要UseMvc()函数。

对于UseMvc,它使用the IRouter-based logic,而EnableEndpointRouting使用endpoint-based logic。他们遵循不同的逻辑,可以在下面找到:

if (options.Value.EnableEndpointRouting)
{
var mvcEndpointDataSource = app.ApplicationServices
.GetRequiredService<IEnumerable<EndpointDataSource>>()
.OfType<MvcEndpointDataSource>()
.First();
var parameterPolicyFactory = app.ApplicationServices
.GetRequiredService<ParameterPolicyFactory>();


var endpointRouteBuilder = new EndpointRouteBuilder(app);


configureRoutes(endpointRouteBuilder);


foreach (var router in endpointRouteBuilder.Routes)
{
// Only accept Microsoft.AspNetCore.Routing.Route when converting to endpoint
// Sub-types could have additional customization that we can't knowingly convert
if (router is Route route && router.GetType() == typeof(Route))
{
var endpointInfo = new MvcEndpointInfo(
route.Name,
route.RouteTemplate,
route.Defaults,
route.Constraints.ToDictionary(kvp => kvp.Key, kvp => (object)kvp.Value),
route.DataTokens,
parameterPolicyFactory);


mvcEndpointDataSource.ConventionalEndpointInfos.Add(endpointInfo);
}
else
{
throw new InvalidOperationException($"Cannot use '{router.GetType().FullName}' with Endpoint Routing.");
}
}


if (!app.Properties.TryGetValue(EndpointRoutingRegisteredKey, out _))
{
// Matching middleware has not been registered yet
// For back-compat register middleware so an endpoint is matched and then immediately used
app.UseEndpointRouting();
}


return app.UseEndpoint();
}
else
{
var routes = new RouteBuilder(app)
{
DefaultHandler = app.ApplicationServices.GetRequiredService<MvcRouteHandler>(),
};


configureRoutes(routes);


routes.Routes.Insert(0, AttributeRouting.CreateAttributeMegaRoute(app.ApplicationServices));


return app.UseRouter(routes.Build());
}

对于EnableEndpointRouting,它使用EndpointMiddleware将请求路由到端点。

我在以下官方文档“从ASP迁移。NET Core 2.2到3.0”中找到了解决方案:

有3种方法:

  1. 用UseEndpoints替换UseMvc或UseSignalR。

在我的例子中,结果是这样的

  public class Startup
{


public void ConfigureServices(IServiceCollection services)
{
//Old Way
services.AddMvc();
// New Ways
//services.AddRazorPages();
}




public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}


app.UseStaticFiles();
app.UseRouting();
app.UseCors();


app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}");
});


}
}
< p >或< br > 2. 使用AddControllers()和UseEndpoints()

public class Startup
{


public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
}




public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}


app.UseStaticFiles();
app.UseRouting();
app.UseCors();


app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});


}
}
< p >或< br > 3.禁用端点路由。使用不带端点路由的mvc


services.AddMvc(options => options.EnableEndpointRouting = false);
//OR
services.AddControllers(options => options.EnableEndpointRouting = false);

使用以下代码

app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute();
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello World!");
});
});

这对我来说是有效的(在Startup.cs > ConfigureServices方法中添加):

services.AddMvc(option => option.EnableEndpointRouting = false)

可以使用: 在ConfigureServices方法中:

services.AddControllersWithViews();

配置方法:

app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});

对于DotNet核心3.1

使用下面的

文件:Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{


if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
       

app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}

我发现这个问题是由于. net Core框架的更新。最新发布的。net Core 3.0版本需要显式地选择使用MVC。

当人们试图从旧的。net Core(2.2或预览3.0版本)迁移到。net Core 3.0时,这个问题最为明显

如果从2.2迁移到3.0,请使用下面的代码来修复这个问题。

services.AddMvc(options => options.EnableEndpointRouting = false);

如果使用。net Core 3.0模板,

services.AddControllers(options => options.EnableEndpointRouting = false);

修改后的ConfigServices方法如下所示:

enter image description here

谢谢你!

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
//Old Way
services.AddMvc();
// New Ways
//services.AddRazorPages();
}


public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}


app.UseStaticFiles();
app.UseRouting();
app.UseCors();


app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}");
});
}
}

这也适用于。net Core 5

端点路由在ASP上默认是禁用的。NET 5.0

只需在启动中配置

    public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options => options.EnableEndpointRouting = false);
}
    

这对我很有效

这对我很有效

 services.AddMvc(options => options.EnableEndpointRouting = false); or
OR
services.AddControllers(options => options.EnableEndpointRouting = false);

→在ConfigureServices方法中—Startup.cs . conf

        //*****REGISTER Routing Service*****
services.AddMvc();
services.AddControllers(options => options.EnableEndpointRouting = false);

→在“配置方法- Startup.cs”中

       //*****USE Routing*****
app.UseMvc(Route =>{
Route.MapRoute(
name:"default",
template: "{Controller=Name}/{action=Name}/{id?}"
);
});