【问题标题】:How do I get an instance of IAppBuilder elsewhere in my ASP.NET MVC 5.2.3 application?如何在我的 ASP.NET MVC 5.2.3 应用程序的其他地方获取 IAppBuilder 的实例?
【发布时间】:2015-11-02 02:30:13
【问题描述】:

我需要构建一个 Owin 中间件对象,但不是来自 Startup 类。我需要从代码中的其他任何地方构建它,所以我需要引用应用程序的AppBuilder 实例。有没有办法从其他地方得到它?

【问题讨论】:

  • 您是如何设法将您构建的内容保留在后续请求中的?一旦用户登录,我就为每个 OWIN 上下文创建了用户管理器,但是当导航到其他一些 MVC 控制器时它是空的。

标签: asp.net asp.net-mvc asp.net-mvc-5 owin katana


【解决方案1】:

您可以简单地将AppBuilder 本身注入OwinContext。但是由于 Owin 上下文只支持 IDisposable 对象,所以将其包装在 IDisposable 对象中并注册它。

public class AppBuilderProvider : IDisposable
{
    private IAppBuilder _app;
    public AppBuilderProvider(IAppBuilder app)
    {
        _app = app;
    }
    public IAppBuilder Get() { return _app; }
    public void Dispose(){}
}

public class Startup
{
    // the startup method
    public void Configure(IAppBuilder app)
    {
        app.CreatePerOwinContext(() => new AppBuilderProvider(app));
        // another context registrations
    }
}

因此,在您的代码的任何地方,您都可以访问 IAppBuilder 对象。

public class FooController : Controller
{
    public ActionResult BarAction()
    {
        var app = HttpContext.Current.GetOwinContext().Get<AppBuilderProvider>().Get();
        // rest of your code.        
    }
}

【讨论】:

  • 太棒了!为什么我没有想到呢? :-)
  • FooController 中的代码不起作用。 IOwinContext.Get&lt;T&gt; 没有没有参数的方法,您必须提供密钥。这个键是CreatePerOwinContext() 内部创建的一些奇怪的键,它以"AspNet.Identity.Own:" 和Assembly 限定类型名称开头,即typeof(yourtype).AssemblyQualifiedName。在此处查看我的答案:stackoverflow.com/a/36044219/323456
  • @enorl76 我在此示例中使用的Get 方法是在Microsoft.AspNet.Identity.Owin 程序集中实现的扩展方法。因此,如果您在项目中添加了相关包并在文件中添加 Microsoft.AspNet.Identity.Owin 命名空间,您也可以使用此方法。
  • @SamFarajpourGhamari 这就是为什么我真的不喜欢扩展方法。感谢您的提示。
  • 让这个旧线程重新焕发生机。我按照答案中的步骤进行操作。因此,虽然在添加中间件方面一切顺利,但下一个请求似乎确实是在管道中找到中间件。只是为了给出一个上下文,在我的情况下,它是一个不记名令牌身份验证中间件。因此,当我看到 401 时,我添加了中间件(首先不确定是否可以这样做)n 但我的下一个请求仍然得到 401。令牌没问题,所以仍然缺少中间件。跨度>
猜你喜欢
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 2023-03-28
相关资源
最近更新 更多