1. ホーム
  2. c#

[解決済み】エンドポイントルーティングの使用中にMVCを設定するために「UseMvc」を使用することはサポートされていません。

2022-04-07 04:58:48

質問

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

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

エンドポイントを使用している場合、'UseMvc' を使用して MVC を設定することはサポートされていません。 ルーティングを行います。UseMvc」の使用を継続するには、以下のように設定してください。 'ConfigureServices' 内の 'MvcOptions.EnableEndpointRouting = false' を設定します。

を設定することで、そのようなことが可能になると理解しています。 EnableEndpointRouting をfalseにすれば解決するのですが、何が適切な解決方法なのか、なぜEndpoint Routingには UseMvc() 関数を使用します。

どのように解決するのですか?

<ブロッククオート

しかし、私はそれを解決するための適切な方法を知っておく必要があります。

一般的には EnableEndpointRouting の代わりに UseMvc を参照することができます。 ルーティング起動コードの更新 を有効にするための詳細な手順については EnableEndpointRouting .

<ブロッククオート

Endpoint Routingが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 を使用します。 エンドポイントミドルウェア を使用して、リクエストをエンドポイントにルーティングします。