【问题标题】:Owin running before Structure Map configuration在结构图配置之前运行 Owin
【发布时间】:2014-04-27 20:34:58
【问题描述】:

在使用 OWIN 的 ASP.NET MVC 5 项目中,我有以下内容:

[assembly: OwinStartup(typeof(MvcProj.Site.OwinStartup), "Configure")]

namespace MvcProj.Site {

  public partial class OwinStartup {
    public void Configure(IAppBuilder application) {

      UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);

      application.UseCookieAuthentication(new CookieAuthenticationOptions {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        CookieSecure = CookieSecureOption.SameAsRequest,
        LoginPath = new PathString(url.Action(MVC.User.SignIn())),
        ReturnUrlParameter = "redirect"
      });

      application.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

    } // Configure

  } // OwinStartup

}

如您所见,我将登录路径定义如下:

LoginPath = new PathString(url.Action(MVC.User.SignIn())),

我从 StructureMap 收到一个错误,说我没有定义 ITranslator ...

事实上它是定义的,但我所有的控制器都是基于 BaseController:

public abstract class BaseController : Controller, ITranslator_ {

  public readonly ITranslator _translator;

  protected BaseController() {
    _translator = ObjectFactory.Container.GetInstance<ITranslator>();
  } // BaseController

  public String _(String value) {
    return _translator.Translate(value);
  } // _

}

所以我认为 Owin 在 global.asax 应用程序启动中的 IoC 代码之前运行。

如果我删除代码行 LoginPath = new PathString(url.Action(MVC.User.SignIn())) 那么一切正常。

有人可以告诉我如何解决这个问题吗?

谢谢,

米格尔

【问题讨论】:

  • 不应在构造函数中调用ObjectFactory.Container.GetInstance&lt;ITranslator&gt;(),而应将ITranslator 实例传递给它。

标签: asp.net-mvc owin


【解决方案1】:

Microsft.Owin.SystemWeb 主机使用 PreApplicationStartMethodAttributebootstrap itself,它在您的 Application_Start 方法之前运行。这就是您看到崩溃的原因。您需要将 DI 设置移动到 Startup 类中。

我已经从 ASP.NET MVC 切换到Nancy,但是除了需要为 MVC 设置依赖关系解析器之外,您的设置应该类似。为此,您需要安装 StructureMap.MVC4,然后删除它添加的 StructuremapMvc 类,因为您的设置代码现在位于 Startup 类中。

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var container = SetupStructureMap();

        // sets up the mvc dependency resolver
        DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
        GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container);

        SetupAuth(app, container);
    }

    private static IContainer SetupStructureMap()
    {
        ObjectFactory.Initialize(x =>
        {
            // ...
        });

        return ObjectFactory.Container;
    }

    public static void SetupAuth(IAppBuilder app, IContainer container)
    {
        app.SetDataProtectionProvider(container.GetInstance<IDataProtectionProvider>());
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = Constants.AppAuthType,
            CookieHttpOnly = true,
            CookieName = "app.id",
            LogoutPath = new PathString("/logout"),
            Provider = container.GetInstance<ICookieAuthenticationProvider>(),
            ReturnUrlParameter = string.Empty
        });
    }
}

我的 Startup 课程大致基于 JabbR 的课程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-24
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 2014-09-20
    相关资源
    最近更新 更多