SlashBaseServiceという名前のベースApiControllerを持つwebapiプロジェクトがあります。
[RouteArea("uBase")]
public abstract class SlashBaseService : ApiController
{
}
結果のdllはWebFormsプロジェクトで使用されるため、ルートを生成する次のコードを含むWebActivatorクラスもあります。
RouteTable.Routes.MapHttpAttributeRoutes(config =>
{
// Get all services inheriting from SlashBaseService
foreach (var Assembly in AppDomain.CurrentDomain.GetAssemblies())
{
foreach (var type in Assembly.GetTypes())
{
if (type.IsSubclassOf(typeof(SlashBaseService)))
{
// Scan Assembly
config.ScanAssembly(Assembly);
// Skip the remaining types in this Assembly
break;
}
}
}
});
RouteTable.Routes.MapHttpRoute(
name: "DefaultBase",
routeTemplate: "base/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
別のアセンブリにもテストサービスがあります。
public class SampleSlashBaseService : SlashBaseService
{
[GET("TestOpenMethod")]
public string GetTestOpenMethod()
{
return "Hello anonymous!";
}
[GET("Echo/{message}")]
public string GetEcho(string message)
{
return message;
}
}
すべてかなり単純なものです。問題は、これが生成するURLの1つにアクセスしようとすると、次のメッセージが表示されることです。
「SampleSlashBaseService」という名前のコントローラーに一致するタイプが見つかりませんでした。
/routes.axdからのルートリストも正しく見えます。
問題が見つかりました。
ApiControllers
クラス名の末尾には「Controller」を付ける必要がありますが、私の場合はそうではありませんでした。 SampleSlashBaseController
に変更すると、問題は解決しました。
注:私がしたように "Service"でサフィックスを付けることは可能ですが、ここで説明されているようにカスタムIHttpControllerSelector
を実装する必要があります: http://netmvc.blogspot.no/2012/ 06/aspnet-mvc-4-webapi-support-areas-in.html
また、ControllerクラスがPublicであることを確認する必要もあります。
私の場合、コントローラーは適切に定義されていましたが、パブリックとしてマークされていませんでした。
私の場合、同じ名前の2つのコントローラーが異なるフォルダーにありました。それらの名前を変更すると、問題は即座に解決されました。
それだけの価値があるので、私はこれに遭遇しましたが、私の問題は、手動で追加したクラスがApiControllerから継承されていないことでした。クラス定義はpublic class QueueController : ApiController
ではなくpublic class QueueController
である必要があります。見落とすなんてばかげたこと。