最近、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をクリーンアップおよび削除しようとしました。
同様の問題があり、WebApiConfig.csファイルにこの行のコピーを追加した私の部分のコピーペーストエラーに関連していました:
config.MapHttpAttributeRoutes();
これらのうちの1つだけがあることを確認してください。
Global.asaxで、回数を確認しますWebApiConfig.Register
関数が呼び出されました。
解決しました!行WebApiConfig.Register(GlobalConfiguration.Configuration);
をGlobal.asax.csから削除しましたApplication_Start
。
新しいファイルをコピーする前に展開ディレクトリをクリーンアップすることで解決しました。おそらく、同じルートを複数回登録しようとする古いファイルがいくつかありました。
私が行ったようにこれを偶然見つけた人にとって、アセンブリ名(プロジェクトプロパティ)の名前を変更すると、このエラーが発生します。私の場合、プロジェクトの名前を変更していて、プロパティに移動してアセンブリ名を変更しました(VS2013では変更できません)。
アセンブリ名が異なるため、「古い」アセンブリが\ binフォルダーにある場合、クリーンアップまたは再ビルドでは削除されません。\binフォルダーからアセンブリを削除してから、再ビルドして実行する必要があります。
私は同じ問題を抱えていましたが、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 }
);
}
}
おそらく同じレジスタが複数あります。
Global.asaxから以下のコードを削除してみてください。
GlobalConfiguration.Configure(WebApiConfig.Register); RouteConfig.RegisterRoutes(RouteTable.Routes);
それらの代わりにこれを書いてください:
GlobalConfiguration.Configuration.EnsureInitialized(); BundleConfig.RegisterBundles(BundleTable.Bundles);
理由はわかりません。しかし、それは私の同じケースで私のために働いた。
私の場合のエラーは次のとおりです:「 '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();
行を削除しましたが、解決されました。
同様の問題も発生していました(特に_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"));
_
直接関連しているかどうかにかかわらず、このスニペットが役立つことを願っています!
私は同じ問題を経験していました。私が見つけた解決策は、モノのビジュアルベーシックサポートが必要だということでした。 「yum install mono-basic」を実行してコンピューターを再起動すると、エラーは解消しました。