我使用OWIN在Windows服务中托管了一个ASP.NET Web API项目。我使用的Startup类配置了一些东西,并使用了IAppBuilder.UseWebApi()选项。一切都在调试器和命令行中完美运行(我使用命令行参数-e在控制台中运行,或者它可以作为Windows服务运行)。
一切都运行良好,但是,当我在发布模式下构建并为#34;优化代码"启用构建选项时,我的服务控制器似乎无法正常工作。
我将控制器放在一个单独的类库中,我使用此行在应用程序启动时探测控制器,如下所示:Self-hosting WebAPI application referencing controller from different assembly
var controllerType = typeof(MetricsController);
我感觉Optimize Code选项会导致编译器忽略此行。有没有人对我如何使这项工作有任何见解或想法?
谢谢!
答案 0 :(得分:1)
在使用了这个之后,我实现了以下方法,优化代码选项似乎很满意。
班级成员:
private readonly List<Type> _controllers = new List<Type>();
然后在我的Startup.Configuration方法中,我将其替换为:
// Hack: This forces a manual probe of the controller assembly
var controllerType = typeof(MyController);
有了这个:
// Better Hack: This forces a manual probe of the controller assembly
_controllers.Add(typeof(MyController));
似乎正在发生的事情是Optimize Code选项正在剥离声明但从未使用过的逻辑。在这种情况下,我使用原始hack来探测程序集,以便应用程序知道它的存在。由于它的范围非常严格且从未使用变量controllerType
,因此编译器会忽略它。新方法可能只是提示可能使用编译器保留它。
我尝试了一种基于反射的方法但却无法使其发挥作用。我甚至手动加载了具有控制器的程序集,我可以在调试时看到它在AppDomain中加载,但由于某种原因它仍然无法工作。我甚至可以验证列表是否填充了控制器类型,但奇怪的是没有运气。由于我将来会在另一个项目中使用类似的方法,所以对这方面的任何建议都绝对持开放态度。