2017-01-03 11 views
2

アクションにカスタムルート属性を追加しようとすると、依存関係注入に問題があります。autofacで属性ルーティングを使用しようとしたときに例外が発生しました

System.InvalidOperationException: An error occurred when trying to create a controller of type 'UsersController'. Make sure that the controller has a parameterless public constructor.

スタックトレース:

at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request) 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext() 

私はGET、POSTなどのような標準的な方法を使用しようとしているときには、私は、私はエラーを取得していますFindUsersByRoleアクションを呼んでいるとき、すべてが正常に動作しています内部例外:

System.ArgumentException: Type 'Novelis.WebApi.Controllers.UsersController' does not have a default constructor

のStackTrace:

at System.Linq.Expressions.Expression.New(Type type) 
at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
ここ

は私のコントローラの一部です:

ここ
[Authorize] 
public class UsersController : ApiController 
{ 
    private readonly IUsersRepository _usersRepository; 

    public UsersController(IUsersRepository usersRepository) 
    { 
     _usersRepository = usersRepository; 
    } 

    //This is working fine 
    [HttpGet] 
    [ResponseType(typeof(List<UserInfoDto>))] 
    public IHttpActionResult Get() 
    { 
     IList<UserInfoDto> values = _usersRepository.SelectAll(); 

     if (values == null || !values.Any()) 
      return Ok(); 

     return Json(new { collection = values }); 
    } 

    //here I get an error 
    [HttpGet] 
    [Route("api/test/{roleId}/books")] 
    public IHttpActionResult FindUsersByRole(int roleId) 
    { 
     // association code 

     return Ok("test"); 
    } 
} 

は私が呼んでいるURLです:

localhost:81/api/Users - 細かい

localhost:81/api/test/1/books作業 - エラー

私はまた私を掲示していますconfigクラス:

グローバル.asax:

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 

    AutofacConfig.Register(); 
} 

AutofacConfig:

public class AutofacConfig 
{ 
    public static void Register() 
    { 
     var builder = new ContainerBuilder(); 

     builder.RegisterModule(new AutoMapperModule()); 
     builder.RegisterApiControllers(typeof(WebApiApplication).Assembly).PropertiesAutowired(); 
     builder.RegisterModule(new NlogModule()); 
     builder.RegisterModule(new RepositoryModule()); 

     var container = builder.Build(); 
     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
     GlobalConfiguration.Configuration.DependencyResolver = 
      new AutofacWebApiDependencyResolver(container); 
    } 
} 

WebApiConfig:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

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

     config.Filters.Add(new ExceptionHandlingAttribute()); 
    } 
} 

スタートアップ:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     HttpConfiguration config = new HttpConfiguration(); 
     config.MapHttpAttributeRoutes(); 
     ConfigureOAuth(app); 
     app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 
     app.UseWebApi(config); 
    } 
} 
+0

'[RoutePrefix( "API /ユーザ")] [承認] パブリッククラスがUserController与えてみてください:' ApiController {...}をと '[ルート(「テスト/ {roleId}として' FindUsersByRole'経路を変更します/ books ")]'を実行し、url 'localhost:81/api/users/test/1/books'を使用してメソッドをヒットします – Developer

+0

あなたは使用しているパッケージを投稿できますか?あなたは 'Autofac.WebApi2'パッケージがあることを知っていますか? –

+0

@Developerでも引き続き同じエラーが発生する –

答えて

1

次の2つの異なるHttpConfigurationを使用しています。 IISによってGlobalConfigurationに提供されたものと手動で作成したものStartup

それが問題の原因です。

HttpConfigurationのコードをStartup.csにすべて削除すると、IISとOWINとの競合が発生します。これは通常、自己ホストのOWIN Web Apiで行われます。

は、他のすべてが以前のように残っている可能性がスタートアップ

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     ConfigureOAuth(app); 
     app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);   
    } 
} 

を更新しました。

+0

それはそれでした!私は重複に気付かなかった。どうもありがとう! –

関連する問題