web-dev-qa-db-ja.com

「MS_attributerouteWebApi」という名前のルートはすでにルートコレクションにあります

最近、MVC WebAPIプロジェクトに_Microsoft.AspNet.WebApi.WebHost_を追加しました。これにより、アクションで[Route("api/some-action")]属性を使用できるようになります。 この記事 を使用していくつかのエラーを解決しましたが、以下の3番目のエラーを解決できません。以下に解決したエラーを追加して、私が何か間違ったことをした場合のフィードバックを得ます。

最初のエラー:名前「some-action」に一致するコントローラ「X」でアクションが見つかりませんでした
ソリューションconfig.MapHttpAttributeRoutes();をWebApiConfig.cs Registerメソッドに追加しました。

2番目のエラー:System.InvalidOperationExceptionオブジェクトはまだ初期化されていません。他のすべての初期化コードの後に​​、アプリケーションの起動コードでHttpConfiguration.EnsureInitialized()が呼び出されていることを確認します。
ソリューションGlobalConfiguration.Configure(WebApiConfig.Register);をGlobal.asax.csに追加しました_Application_Start_

3番目のエラー:System.ArgumentException: 'MS_attributerouteWebApi'という名前のルートは既にルートコレクションにあります。ルート名は一意である必要があります。
Solution=?

この投稿 に従って、binフォルダーからすべてのDLLをクリーンアップおよび削除しようとしました。

20
joym8

同様の問題があり、WebApiConfig.csファイルにこの行のコピーを追加した私の部分のコピーペーストエラーに関連していました:

config.MapHttpAttributeRoutes();

これらのうちの1つだけがあることを確認してください。

32
BraveNewMath

Global.asaxで、回数を確認しますWebApiConfig.Register関数が呼び出されました。

12
JoeyZhao

解決しました!行WebApiConfig.Register(GlobalConfiguration.Configuration);をGlobal.asax.csから削除しましたApplication_Start

6
joym8

新しいファイルをコピーする前に展開ディレクトリをクリーンアップすることで解決しました。おそらく、同じルートを複数回登録しようとする古いファイルがいくつかありました。

5
Davide Icardi

私が行ったようにこれを偶然見つけた人にとって、アセンブリ名(プロジェクトプロパティ)の名前を変更すると、このエラーが発生します。私の場合、プロジェクトの名前を変更していて、プロパティに移動してアセンブリ名を変更しました(VS2013では変更できません)。

アセンブリ名が異なるため、「古い」アセンブリが\ binフォルダーにある場合、クリーンアップまたは再ビルドでは削除されません。\binフォルダーからアセンブリを削除してから、再ビルドして実行する必要があります。

2
VictorySaber

私は同じ問題を抱えていましたが、WebApiConfig.csで、APIバージョンの構成を追加した後にそれを発見しました

私はそれらの2行を持っています

config.MapHttpAttributeRoutes(constraintResolver);

config.MapHttpAttributeRoutes();

2行目を削除しました

最終的なコードは

 public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {

        // Web API routes
        var constraintResolver = new DefaultInlineConstraintResolver()
        {
            ConstraintMap =
            {
                ["apiVersion"] = typeof( ApiVersionRouteConstraint )
            }
        };
        config.MapHttpAttributeRoutes(constraintResolver);
        config.AddApiVersioning();

        // Web API configuration and services

        // Web API routes
       // config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );


    }
}
1
Mohamed Salah

おそらく同じレジスタが複数あります。

Global.asaxから以下のコードを削除してみてください。

GlobalConfiguration.Configure(WebApiConfig.Register);
  RouteConfig.RegisterRoutes(RouteTable.Routes);

それらの代わりにこれを書いてください:

GlobalConfiguration.Configuration.EnsureInitialized(); BundleConfig.RegisterBundles(BundleTable.Bundles);

理由はわかりません。しかし、それは私の同じケースで私のために働いた。

1
nzrytmn

私の場合のエラーは次のとおりです:「 'MS_attributerouteWebApi'という名前のルートはすでにルートコレクションにあります。ルート名は一意である必要があります。パラメーター名:name」

コードは:

_public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            config.MapHttpAttributeRoutes();  // this line had issue

            var constraintResolver = new DefaultInlineConstraintResolver();
            constraintResolver.ConstraintMap.Add("nonzero", typeof(NonZeroConstraint));
            config.MapHttpAttributeRoutes(constraintResolver);

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
_

解決策:上記のメソッドからconfig.MapHttpAttributeRoutes();行を削除しましたが、解決されました。

0
Sagar Pandit

同様の問題も発生していました(特に_MS_attributerouteWebApi_ルートではなく、別の名前付きルート)。 config.MapHttpAttributeRoutes()が1つだけ存在することを確認した後、MapHttpAttributeRoutesが外部参照されたものを含むすべてのプロジェクトアセンブリを登録することに気付き始めました。独自のルートを登録している参照されたアセンブリがあることを知った後、DefaultDirectRouteProviderをオーバーライドしてルートを除外または「スキップ」する方法を見つけました。

_/// <summary>
/// Allows for exclusion from attribute routing of controllers based on name
/// </summary>
public class ExcludeByControllerNameRouteProvider : DefaultDirectRouteProvider {

    private string _exclude;
    /// <summary>
    /// Pass in the string value that you want to exclude, matches on "ControllerType.FullName" and "ControllerType.BaseType.FullName"
    /// </summary>
    /// <param name="exclude"></param>
    public ExcludeByControllerNameRouteProvider(string exclude) {
        _exclude = exclude;
    }

    protected override IReadOnlyList<RouteEntry> GetActionDirectRoutes(
    HttpActionDescriptor actionDescriptor,
    IReadOnlyList<IDirectRouteFactory> factories,
    IInlineConstraintResolver constraintResolver)
    {
        var actionRoutes = new List<RouteEntry>();
        var currentController = actionDescriptor.ControllerDescriptor.ControllerType;
        if (!currentController.FullName.Contains(_exclude) && !currentController.BaseType.FullName.Contains(_exclude))
        {
            var result = base.GetActionDirectRoutes(actionDescriptor, factories, constraintResolver);
            actionRoutes = new List<RouteEntry>(result);
        }
        return actionRoutes.AsReadOnly();
    }
}
_

これにより、次のようにコントローラ名またはベースタイプ名を渡して、_WebApiConfig.cs_で除外できます。

_config.MapHttpAttributeRoutes(new ExcludeByControllerNameRouteProvider("Controller.Name"));
_

直接関連しているかどうかにかかわらず、このスニペットが役立つことを願っています!

0
vandsh

私は同じ問題を経験していました。私が見つけた解決策は、モノのビジュアルベーシックサポートが必要だということでした。 「yum install mono-basic」を実行してコンピューターを再起動すると、エラーは解消しました。

0
DonM