[英]Unable to register Api Controller using Simple Injector?
I have a WebApi that uses Simple Injector that was working perfectly fine, but i had to implement OAuth in to the project.我有一个使用 Simple Injector 的 WebApi,它工作得非常好,但我必须在项目中实现 OAuth。 Now i have done that and my ApiControllers give me an error like Simple Injector has now been setup correctly
现在我已经做到了,我的 ApiControllers 给了我一个错误,比如 Simple Injector 现在已经正确设置
I have my Start.cs file我有我的 Start.cs 文件
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Web API configuration and services
HttpConfiguration config = new HttpConfiguration();
Container container = SimpleInjectorConfig.Initialize(app);
ConfigureAuth(app, container);
WebApiConfig.Register(config);
app.UseWebApi(config);
}
public void ConfigureAuth(IAppBuilder app, Container container)
{
var OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = container.GetInstance<IOAuthAuthorizationServerProvider>()
};
// Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}
In my SimpleInjectorConfig file i have在我的 SimpleInjectorConfig 文件中,我有
public class SimpleInjectorConfig
{
public static Container Initialize(IAppBuilder app)
{
var container = GetInitializeContainer(app);
container.Verify();
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
return container;
}
public static Container GetInitializeContainer(IAppBuilder app)
{
var container = new Container();
container.RegisterSingle<IAppBuilder>(app);
container.Register<IOAuthAuthorizationServerProvider,
ApiAuthorizationServerProvider>();
// myService
container.Register<IService, MyService>();
// myRepository
container.Register<IRepository, MyRepository>();
// This is an extension method from the integration package.
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
return container;
}
}
public class ApiAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
private IService _service;
public ApiAuthorizationServerProvider(IService service)
{
_service = service;
}
public override async Task ValidateClientAuthentication(
OAuthValidateClientAuthenticationContext context)
{
context.Validated();
}
public override async Task GrantResourceOwnerCredentials(
OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers
.Add("Access-Control-Allow-Origin", new[] { "*" });
User user = _service.Query(e => e.Email.Equals(context.UserName) &&
e.Password.Equals(context.Password)).FirstOrDefault();
if (user == null)
{
context.SetError("invalid_grant",
"The user name or password is incorrect.");
return;
}
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim("sub", context.UserName));
identity.AddClaim(new Claim("role", "user"));
context.Validated(identity);
}
}
Now my project builds fine, but i cannot test if OAuth is working yet, because i cannot connect to my ApiController.现在我的项目构建良好,但我无法测试 OAuth 是否正常工作,因为我无法连接到我的 ApiController。 I have not added the [Authorize] tag to the Controller yet, so i should be able to access it.
我还没有将 [Authorize] 标签添加到 Controller 中,所以我应该能够访问它。
Here is my controller这是我的控制器
public class MyController : ApiController
{
private IService _service;
public MyController(IService service)
{
_service = service;
}
public IHttpActionResult Get()
{
// get all entities here via service
return Ok(list);
}
}
The error message i get says我收到的错误消息说
An error occurred when trying to create a controller of type 'MyController'.
尝试创建类型为“MyController”的控制器时发生错误。 Make sure that the controller has a parameterless public constructor.
确保控制器具有无参数的公共构造函数。
I thought this would be registered via我以为这将通过注册
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
In .NET Core add:在 .NET Core 中添加:
// Sets up the basic configuration that for integrating Simple Injector with
// ASP.NET Core by setting the DefaultScopedLifestyle, and setting up auto
// cross wiring.
services.AddSimpleInjector(_container, options =>
{
// AddAspNetCore() wraps web requests in a Simple Injector scope and
// allows request-scoped framework services to be resolved.
options.AddAspNetCore()
.AddControllerActivation();
});
via https://simpleinjector.readthedocs.io/en/latest/aspnetintegration.html通过https://simpleinjector.readthedocs.io/en/latest/aspnetintegration.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.