2015-12-14 3 views
0

Я знаю, что есть много сообщений, очень похожих на этот. Однако я прошел через них и не смог найти решение моей проблемы.Asp.Net API 2 Конфигурация Ninject и OWIN OAuth

Я реализую аутентификацию OAth с использованием OWIN в предыдущем проекте, который использует Ninject для инъекции зависимостей.

Чтобы реализовать OATH с использованием OWIN, переключился с исходного метода Global.asax Application_Start на создание файла/класса Start.cs, который используется для настройки OWIN.

Проблема, с которой я столкнулся, заключается в том, что независимо от того, какую реализацию я пытаюсь запустить код, запрос API всегда возвращает ошибку «Убедитесь, что контроллер имеет беззадачный публичный конструктор».

Возможно, кто-то проливает свет на то, почему ни один из нижеприведенных подходов не работает?

Моя первая попытка решить проблему - использовать app.UseNinjectMiddleware с app.UseNinjectWebApi. Во-вторых, я попробовал NinjectDependencyResolver, о котором упоминалось во многих предыдущих сообщениях. Link to similar post.

Ниже приведен код, охватывающий обе реализации.

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var config = new HttpConfiguration(); 
     var kernel = NinjectWebCommon.CreateKernel(); 

     // Using this and UseNinjectWebAPI 
     app.UseNinjectMiddleware(() => kernel); 

     ConfigureOAuthTokenGeneration(app); 
     ConfigureWebApi(config); 

     app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 

     WebApiConfig.Register(config); 
     app.UseNinjectWebApi(config); 

     // Also tried this (when the following lines are uncommented UseNinjectMiddleware and useNinjectWebApi is commented) 
     // This causes "Make sure that the controller has a parameterless public constructor" error 
     //GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); 
     //app.UseWebApi(config); 
    } 

    private void ConfigureOAuthTokenGeneration(IAppBuilder app) 
    { 
     // Configure the db context and user manager to use a single instance per request 
     app.CreatePerOwinContext(ApplicationDbContext.Create); 
     app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 

     // Plugin the OAuth bearer JSON Web Token tokens generation and Consumption will be here 

    } 

    private void ConfigureWebApi(HttpConfiguration config) 
    { 
     var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First(); 
     jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
    } 
} 

Вот мой NinjectWebCommon класс

//[assembly:  WebActivatorEx.PreApplicationStartMethod(typeof(TimeUp.Web.Api.App_Start.NinjectWebCommon), "Start")] 
//[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(TimeUp.Web.Api.App_Start.NinjectWebCommon), "Stop")] 

namespace Shopping 
{ 
    public static class NinjectWebCommon 
    { 
     private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

     /// <summary> 
     /// Starts the application 
     /// </summary> 
     public static void Start() 
     { 
      DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
      DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
      bootstrapper.Initialize(CreateKernel); 
     } 

     /// <summary> 
     /// Stops the application. 
     /// </summary> 
     public static void Stop() 
     { 
      bootstrapper.ShutDown(); 
     } 

     /// <summary> 
     /// Creates the kernel that will manage your application. 
     /// </summary> 
     /// <returns>The created kernel.</returns> 
     public static IKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      try 
      { 
       kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
       kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

       RegisterServices(kernel); 

       return kernel; 
      } 
      catch 
      { 
       kernel.Dispose(); 
       throw; 
      } 
     } 

     /// <summary> 
     /// Load your modules or register your services here! 
     /// </summary> 
     /// <param name="kernel">The kernel.</param> 
     private static void RegisterServices(IKernel kernel) 
     { 
     } 
    } 
} 

Благодаря передовой

ответ

0

я, наконец, решить эту проблему, решение было использовать исходный класс NinjectWebCommon, поставляемое с Ninject.Web.Common библиотека. Метод запуска этого класса срабатывает перед запуском. Конфигурация может быть использована с этим Dependency Resolver, удалив его через загрузчик. Вот моя рабочая конфигурация.

public void Configuration(IAppBuilder app) 
    { 
     var config = new HttpConfiguration(); 

     config.DependencyResolver = new NinjectResolver(new Ninject.Web.Common.Bootstrapper().Kernel); 
     WebApiConfig.Register(config); 

     app.UseWebApi(config); 
    } 
Смежные вопросы