エンドポイントルーティングの使用中は、「UseMvc」を使用してMVCを構成することはサポートされていません


119

Asp.Netコア2.2プロジェクトがありました。

最近、バージョンを.net core 2.2から.net core 3.0 Preview 8に変更しました。この変更後、次の警告メッセージが表示されます。

エンドポイントルーティングの使用中は、「UseMvc」を使用してMVCを構成することはできません。「UseMvc」を引き続き使用するには、「ConfigureServices」内で「MvcOptions.EnableEndpointRouting = false」を設定してください。

EnableEndpointRoutingfalseに設定することで問題を解決できることを理解していますが、それを解決する適切な方法は何か、エンドポイントルーティングがUseMvc()機能を必要としない理由を知る必要があります。


2
適切な方法について:このドキュメント docs.microsoft.com/en-us/aspnet/core/migration/…に は、「可能であればアプリをエンドポイントルーティングに移行する」と記載されています
dvitel

回答:


23

しかし、私はそれを解決する適切な方法が何であるかを知る必要があります

通常、EnableEndpointRoutingではなくを使用する必要がUseMvcあります。有効にするための詳細な手順については、ルーティングのスタートアップコードの更新を参照してくださいEnableEndpointRouting

エンドポイントルーティングがUseMvc()関数を必要としない理由。

のためにUseMvc、それを使用the IRouter-based logicEnableEndpointRoutingます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をルーティングするために、エンドポイントへのリクエストを。


121

次の公式ドキュメント「ASP.NET Core 2.2から3.0に移行する」で解決策を見つけました:

3つのアプローチがあります。

  1. UseMvcまたはUseSignalRをUseEndpointsに置き換えます。

私の場合、結果はそのように見えました

  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}");
        });

    }
}

または
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();
        });

    }
}

または
3.エンドポイントルーティングを無効にします。例外メッセージが示唆するように、およびドキュメントの次のセクションで説明されているように、エンドポイントルーティングなしでmvcを使用します。


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

2
これはasp.netコア3.0で機能し、この追加Web APIを簡単に使用できます
Tony Dong

1
services.AddRazorPages();代わりに(そのページで)使用することをお勧めしますservices.AddMvc();
BurnsBA '29

1
これは、最初のmvcチュートリアルを実行し、core2.1からcore3.0にアップグレードする場合に適したソリューションです。これは私の問題をすぐに解決しました、ありがとう!
スペンサーポロック

オプション3は
Vic

50

これは私にとってはうまくいきました(アドインStartup.cs> ConfigureServicesメソッド):

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

2
簡単な答えですが、すばらしい答えです!
noobprogrammer

このコードが解決する方法を教えてください、私は解決策を気にしません、私はすでにそれを知っていました、なぜそしてその方法を知りたいのです...
Amir Hossein Ahmadi

3

.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メソッド、

ここに画像の説明を入力してください

ありがとうございました


2

DotNet Core 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();
        });
    }

すべてのサービス構成行をどうするか?
Fanchi

0

使用できます:ConfigureServicesメソッドで:

services.AddControllersWithViews();

そして、Configureメソッドの場合:

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

0

これは私にとって.Net Core 3.1で動作しました。

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

    app.UseRouting();

    app.UseAuthorization();

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

-4

以下のコードを使用

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

このコードが問題をどのように解決するを説明すると役立つでしょう。
ロバートコロンビア

コードを投稿するだけでは十分な答えではありません。このコードが質問にどのように/なぜ/どのように答えるかを説明してください。
nurdyguy

これは箱から出して来るボイラープレートであり、実際にはユーザーが助かるという点でユーザーを助けません
Simon Price
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.