Я создаю приложение Web Api 2 в ASP. NET. Я сделал Авторизацию с использованием токенов JWT и промежуточного программного обеспечения Owin. Теперь при генерации токенов мне нужно сначала проверить учетные данные пользователя через БД. Для этого мне нужно внедрение зависимости конструктора. До сих пор я делал:
Класс частичного запуска Owin
[assembly: OwinStartup(typeof(CampBookingApplication.App_Start.Startup))]
namespace CampBookingApplication.App_Start
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var kernel = ConfigureNinject(app);
ConfigureAuth(app, kernel);
}
public void ConfigureAuth(IAppBuilder app, IKernel kernel)
{
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.UseOAuthAuthorizationServer(kernel.Get<MyOAuthProvider>().GetOptions());
app.UseJwtBearerAuthentication(new MyJwtOptions());
}
}
}
Класс Startup.Ninject
namespace CampBookingApplication.App_Start
{
public partial class Startup
{
public IKernel ConfigureNinject(IAppBuilder app)
{
var config = new HttpConfiguration();
var kernel = CreateKernel();
app.UseNinjectMiddleware(CreateKernel);
app.UseNinjectWebApi(config);
return kernel;
}
public IKernel CreateKernel()
{
var kernel = new StandardKernel();
try
{
RegisterServices(kernel); return kernel;
}
catch
{
kernel.Dispose(); throw;
}
}
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IUserService>().To<UserService>().InSingletonScope();
kernel.Bind<ICampService>().To<CampService>().InSingletonScope();
kernel.Bind<IBookingService>().To<BookingService>().InSingletonScope();
}
}
}
При обращении к API я всегда получаю сообщение об ошибке:
"Произошла ошибка при попытке создать контроллер типа 'CampsController'. Убедитесь, что контроллер имеет параметр без публикации c конструктор. ",
Это означает, что я не могу зарегистрировать свои привязки. Что я делаю неправильно?
Я много раз искал, но не смог решить эту проблему.
ОБНОВЛЕНИЕ 1:
Я прилагаю всю трассировку исключений с кодом контроллера.
Вся трассировка исключений:
{
"Message": "An error has occurred.",
"ExceptionMessage": "An error occurred when trying to create a controller of type 'CampsController'. Make sure that the controller has a parameterless public constructor.",
"ExceptionType": "System.InvalidOperationException",
"StackTrace": " at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()",
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "Type 'CampBookingApplication.Controllers.CampsController' does not have a default constructor",
"ExceptionType": "System.ArgumentException",
"StackTrace": " at System.Linq.Expressions.Expression.New(Type type)\r\n at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"
}
}
CampsController:
public class CampsController : ApiController
{
private readonly ICampService _campService;
public CampsController(ICampService campService)
{
_campService = campService;
}
[HttpGet]
[Authorize]
public IHttpActionResult GetAllCamps()
{
List<CampDTO> camps = _campService.GetAllCamps();
if (camps.Count == 0)
{
return NotFound();
}
return Ok(camps);
}
....
}