【发布时间】:2014-12-10 20:25:31
【问题描述】:
我有一段时间让 Ninject 与标准的 ASP.net Identity 解决方案一起工作。我使用的堆栈是 WebApi 2.2 和 Ninject 3.2。
我使用的是 Generated NinjectWebCommon.cs 文件,稍作修改,我将 CreateKernel 方法公开,所以我可以在 OWIN 管道中注册它。
private static readonly Bootstrapper Bootstrapper = new Bootstrapper();
private static IKernel _kernel;
/// <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()
{
if (_kernel != null) return _kernel;
_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;
}
}
在我为 ASP.net 身份配置 OWIN 的 Startup.Auth.cs 文件中,我尝试使用以下设置 -
public partial class Startup
{
static Startup()
{
PublicClientId = "self";
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
RefreshTokenProvider = new RefreshTokenProvider(),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(20),
#if DEBUG
AllowInsecureHttp = true
#endif
};
}
public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }
public static string PublicClientId { get; private set; }
// For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder app)
{
//allow cors
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
//use ninject in owin
app.UseNinjectMiddleware(NinjectWebCommon.CreateKernel);
app.UseWebApi(GlobalConfiguration.Configuration);
// Enable the application to use bearer tokens to authenticate users
var opts = new OAuthBearerAuthenticationOptions
{
AuthenticationType = "Bearer",
AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
Provider = new QueryStringOAuthBearerProvider("access_token")
};
app.UseOAuthBearerAuthentication(opts);
app.UseOAuthAuthorizationServer(OAuthOptions);
}
}
我遇到的问题是,每当使用 app.UseNinjectMiddleware(NinjectWebCommon.CreateKernel); 时,应用程序都会抛出“序列不包含元素错误”,并带有以下堆栈跟踪-
[InvalidOperationException: Sequence contains no elements]
System.Linq.Enumerable.Single(IEnumerable`1 source) +315
Ninject.Web.Mvc.NinjectMvcHttpApplicationPlugin.Start() +87
Ninject.Web.Common.Bootstrapper.<Initialize>b__0(INinjectHttpApplicationPlugin c) +29
Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map(IEnumerable`1 series, Action`1 action) +194
Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback) +205
Ninject.Web.Common.OwinHost.<Execute>d__1.MoveNext() +257
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21
Microsoft.Owin.Cors.<Invoke>d__0.MoveNext() +1205
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<RunApp>d__5.MoveNext() +287
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<DoFinalWork>d__2.MoveNext() +272
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +22
Microsoft.Owin.Host.SystemWeb.Infrastructure.ErrorState.Rethrow() +33
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar) +150
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) +42
System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +415
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
我在设置要在 OWIN 和其他 IIS 托管 Web 应用程序中使用的 ninject 内核时是否做错了什么?
【问题讨论】:
-
您找到解决方案了吗?
-
我没有,我从使用 Ninject 转而使用 Autofac,所以对我来说这个话题有点像 OBE。但是,我得出的解决方案是在配置类中不使用 DI。我尽可能使用原始实体查询,并根据需要添加其他依赖项。
标签: asp.net asp.net-mvc-5 ninject owin asp.net-web-api2