自托管Web API - 引用的控制器不适用于“优化代码”选项

时间:2014-03-27 22:01:58

标签: c# asp.net visual-studio asp.net-web-api compiler-optimization

我使用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选项会导致编译器忽略此行。有没有人对我如何使这项工作有任何见解或想法?

谢谢!

1 个答案:

答案 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中加载,但由于某种原因它仍然无法工作。我甚至可以验证列表是否填充了控制器类型,但奇怪的是没有运气。由于我将来会在另一个项目中使用类似的方法,所以对这方面的任何建议都绝对持开放态度。