2017-02-01 9 views
4

この問題はかなり一般的ですが、私が読んだことのある解決策は私の場合は一度もありませんでした。私は、既存のMVCプロジェクトにApiControllerを追加しようとしています。Asp.net WebApi: 'xxxx'というコントローラーに一致するタイプが見つかりませんでした。

私はhttp://localhost:51362/api/testで追加コントローラにアクセスしようとすると、私はこのエラーを取得:{"Message":"No HTTP resource was found that matches the request URI 'http://localhost:51362/api/test'.","MessageDetail":"No type was found that matches the controller named 'test'."}

私のプロジェクトは以下のNuGetパッケージが含まれています

  • Microsoft.AspNet.Mvc 5.2.3
  • Microsoft.AspNet.WebApi 5.2.3
  • Microsoft.AspNet.WebApi.Client 5.2.3
  • Microsoft.AspNet.WebApi.Core 5.2.3
  • Microsoft.AspNet.WebApi.WebHost 5.2.3

私のGlobal.asax.cs(抜粋):

RouteTable.Routes.Clear(); 
GlobalConfiguration.Configure(WebApiConfig.Register); 
RouteTable.Routes.MapMvcAttributeRoutes(); 
AreaRegistration.RegisterAllAreas(); 
RouteConfig.RegisterRoutes(RouteTable.Routes); 

マイWebApiConfig.cs:

using System.Web.Http; 

namespace End.Web 
{ 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // Web API configuration and services 
      GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); 

      // Web API routes 
      config.MapHttpAttributeRoutes(); 

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

私の新しいですコントローラ:

using System.Web.Http; 

namespace End.Web.Controllers 
{ 
    public class TestController : ApiController 
    { 
     public string Get() 
     { 
      return "ok"; 
     } 
    } 
} 

属性ルーティングを成功させようとしました。私がやりたいことは本当にシンプルなようです。私は明白な何かを欠いていますか

+0

あなたは '[HTTPGET]' '属性の取得()'アクションを設定しようとしたことがありますか? –

+0

@Roma Web API v2は、メソッドの名前に基づいて自動的にHTTP動詞をマッピングします。これは不要です。 – ADyson

+0

WebApiConfig.Registerメソッドが実際にヒットしたことを再確認できますか? – CoolBots

答えて

1

私はこれが古い問題だと知っていますが、それは決して受け入れられた答えが得られなかったので、私はそれを行かせます。

私もこの正確な問題を抱えていました。私にとって、これは問題解決:私の場合は

GlobalConfiguration.Configure(config => 
{ 
    config.Services.Replace(typeof(IHttpControllerTypeResolver), new DefaultHttpControllerTypeResolver()); 
    ... 
}); 

を、WebHostHttpControllerTypeResolverではなくDefaultHttpControllerTypeResolverを使用しました。 WebHostHttpControllerTypeResolverは、最初にキャッシュ(ファイル)からコントローラタイプを読み込み、そのファイルが存在する場合はそのコンテンツがシリアライズされて返されます。ファイルが存在しない場合、WebHostHttpControllerTypeResolverは代わりにDefaultHttpControllerTypeResolverを呼び出します。

私は最初にWeb APIを設定することで問題は発生しましたが、APIコントローラは一切持っていません。その結果、コントローラータイプのキャッシュリストが空になったため、問題が発生しました。コントローラーの種類はファイル内にキャッシュされるため、Web APIを再起動してもその内容は削除されません。

もう1つの解決策は、キャッシュされたコントローラタイプのリストを格納するファイルを削除することです。ファイルはMS-ApiControllerTypeCache.xmlと呼ばれ、C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\rootというフォルダのどこかにあるはずです。

WebHostHttpControllerTypeResolver.cs

+0

まあ、これは私の問題であったかどうかはわかりません...私はこの問題があったプロジェクト私はあなたの答えを受け入れるでしょう。これは同じ問題である可能性が高いようです。 – youen

関連する問題