使OWIN使用AssemblyResolved()程序集

时间:2018-02-06 21:35:26

标签: c# .net asp.net-core owin

我有一个使用AppDomain.CurrentDomain.AssemblyResolve()加载未解析程序集的控制台应用程序。我在静态构造函数中连接处理程序,并且我正在记录对处理程序的每次调用。

我的控制台应用正在使用Microsoft.Owin.Hosting.WebApp.Start()启动自托管的网络服务。

如果我在与.exe相同的目录中运行带有以下DLL的应用程序,则webservice可以正常运行:

  • Microsoft.Owin.Diagnostics.dll
  • Microsoft.Owin.dll
  • Microsoft.Owin.Host.HttpListener.dll
  • Microsoft.Owin.Hosting.dll
  • Owin.dll
  • System.Net.Http.Formatting.dll
  • System.Web.Http.dll
  • System.Web.Http.Owin.dll
  • System.Web.Http.WebHost.dll

如果我运行的应用程序与这些DLL不在.exe的同一目录中,应用程序启动,我可以看到每个DLL触发对我的处理程序的调用,我可以看到我的处理程序解析查询,并返回请求的程序集,但Web服务不起作用。

我得到了

  

调用目标抛出了异常。内部例外:未找到入口点。

我的猜测是OWIN网络服务没有通过初始化应用程序的AssemblyResolve进程解析其加载的程序集。

OWIN的WebApp()机制是否使用不同的机制来解决装配负载?

或者还有其他可能发生的事情吗?

如果OWIN确实有自己的程序集解析机制,它在哪里记录,我该如何挂钩呢?

我以为我在这里找到了答案:Self-hosting WebAPI application referencing controller from different assembly

但它不适合我。

我正在启动我的WebApp:

 Startup.simpleInjectorContainer = simpleInjectorContainer;

 var startOptions = new StartOptions();
 startOptions.Urls.Add($"http://localhost:{port}/");

 this.webApp = Microsoft.Owin.Hosting.WebApp.Start<Startup>(startOptions);

我的Startup课程:

 public class Startup
 {
      public static Container simpleInjectorContainer;

      public void Configuration(IAppBuilder app)
      {
           var config = new HttpConfiguration
           {
                DependencyResolver = new SimpleInjectorWebApiDependencyResolver(Startup.simpleInjectorContainer)
           };

           config.Services.Replace(typeof(IAssembliesResolver), new CustomAssembliesResolver());

           WebApiConfig.Register(config);
           app.UseWebApi(config);
      }
 }

 public class WebApiConfig
 {
      public static void Register(HttpConfiguration config)
      {
           config.MapHttpAttributeRoutes();

           config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
           );
      }
 }

我的新CustomAssembliesResolver:

public class CustomAssembliesResolver : DefaultAssembliesResolver
{
    public override ICollection<Assembly> GetAssemblies()
    {
        Console.WriteLine("::GetAssemblies()");
        var assemblies = base.GetAssemblies();

        var assembliesToLoad = new[]
        {
            "Microsoft.Owin.Diagnostics",
            "Microsoft.Owin",
            "Microsoft.Owin.Host.HttpListener",
            "System.Net.Http.Formatting",
            "System.Web.Http",
            "System.Web.Http.Owin",
            "System.Web.Http.WebHost",
        };

        foreach (var s in assembliesToLoad)
        {
            Console.WriteLine($"::Trying to load {s}");
            var a = Assembly.Load(s);
            if (a == null)
                Console.WriteLine($"::Could not load {s}");
            else
                Console.WriteLine($"::{s} : {a.FullName}");

            if (!assemblies.Contains(a))
                assemblies.Add(a);
        }

        return assemblies;
    }
}

在使用新的CustomAssembliesResolver替换IAssembliesResolver之后,我发现行为没有区别,而且我没有看到GetAssmblies()被调用。

更多细节。当我在调试器中走动时,我打电话

Microsoft.Owin.Hosting.WebApp.Start<Startup>(startOptions);

当我在Startup.Configuration中遇到一个断点时:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        config.Services.Replace(typeof(IAssembliesResolver), new CustomAssembliesResolver());

        ...
    }
}

app参数已抛出FileNotFoundException:“无法加载程序集'Microsoft.Owin'。”。

看起来我需要先加入装配解决方案。

任何想法如何?

0 个答案:

没有答案