Я знаю, что есть много сообщений, очень похожих на этот. Однако я прошел через них и не смог найти решение моей проблемы.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)
{
}
}
}
Благодаря передовой