web-dev-qa-db-ja.com

WebAPIを使用しようとしたときに「SampleSlashBaseService」という名前のコントローラーに一致するタイプが見つかりませんでした」を取得する

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からのルートリストも正しく見えます。

18
azzlack

問題が見つかりました。

ApiControllersクラス名の末尾には「Controller」を付ける必要がありますが、私の場合はそうではありませんでした。 SampleSlashBaseControllerに変更すると、問題は解決しました。

注:私がしたように "Service"でサフィックスを付けることは可能ですが、ここで説明されているようにカスタムIHttpControllerSelectorを実装する必要があります: http://netmvc.blogspot.no/2012/ 06/aspnet-mvc-4-webapi-support-areas-in.html

53
azzlack

また、ControllerクラスがPublicであることを確認する必要もあります。

9
Eranga

私の場合、コントローラーは適切に定義されていましたが、パブリックとしてマークされていませんでした。

6
mcanti

私の場合、同じ名前の2つのコントローラーが異なるフォルダーにありました。それらの名前を変更すると、問題は即座に解決されました。

2
regisxp

それだけの価値があるので、私はこれに遭遇しましたが、私の問題は、手動で追加したクラスがApiControllerから継承されていないことでした。クラス定義はpublic class QueueController : ApiControllerではなくpublic class QueueControllerである必要があります。見落とすなんてばかげたこと。

1
Adam S