从宿主环境外部访问ASP.NET MVC路径

本文关键字:NET MVC 路径 ASP 访问 宿主 环境 外部 | 更新日期: 2023-09-27 18:00:59

背景:我有一个带有数据库的ASP.NET MVC3应用程序。我还有一个复杂的控制台应用程序,它(除其他外(初始化web应用程序的数据库:生成、添加约束、添加存储过程、添加触发器、种子等。我无法将控制台逻辑移动到web应用程序中(在我们的体系结构中没有意义(。

问题:控制台应用程序显然不是在托管环境中运行的,因此无法访问HostingEnvironmentMapPathHttpContext.CurrentServer.MapPath~等。但我需要从控制台应用程序访问web应用程序的路径。此外,控制台应用程序调用web应用程序,然后web应用程序正常使用这些类,但这些类当然都是null或未定义的。

问题:有没有办法欺骗其中一个类,这样我就可以访问托管环境的路径机制,即使它没有运行?

我可以将我需要的所有路径硬编码到控制台应用程序中,但这是非常不可取的。

我觉得这应该是可能的,因为单元测试也需要同样的需求。

TIA

从宿主环境外部访问ASP.NET MVC路径

编写一个小型web服务并从web应用程序公开所需的数据,然后从控制台应用程序调用它

我所做的(尽管我并不喜欢(:

我们没有在web应用程序中分散各种路径,而是有一个静态Paths类,它包含系统中每个主要资源路径的private static readonly字符串(T4MVC对我们没有帮助的路径(。每当我需要一个指向任何东西的路径时,我都会询问该类,它会对中的字符串执行必要的Path.Combine()等操作——因此结果是,所有硬编码的字符串都存在于一个干净且易于维护的类中。

因此,我向该类添加了一个属性public static string ApplicationRootPath { get; }(请注意公共属性和缺少只读属性(,以及一个静态构造函数,根据您的用例将其初始化为ApplicationRootPath = HostingEnvironment.MapPath("~");"/"

然后,从控制台应用程序中,我可以通过Paths.ApplicationRootPath = "some absolute or relative path here";覆盖"根"目录。在那一行之后,我可以访问网络应用程序中的所有路径,这些路径都有效。

事实上,它很整洁,但仍然不理想。除非有人有更好的主意,否则我会接受这个答案。

Moq非常适合模拟您需要的MVC3上下文。它非常容易设置,并且您可以覆盖通常在web上下文下运行的方法和属性,以返回您想要的对象。

与其试图进一步解释,不如从这里开始:

如何使用Moq模拟ASP.NET MVC中的HttpContext?

MVC 3单元测试-获取实际响应数据

http://www.sharpedgesoftware.com/Blog/2011/03/14/mocking-a-controllercontext-with-authenticated-user-with-moq-for-aspnet-mvc-3

http://code.google.com/p/moq/

您可以尝试一个StructureMap(或其他IoC框架(来实现这一点。在我目前正在进行的一个项目中,我们已经将HttpContextBase连接到网站中的HttpContext.Current对象。通过这种方式,我们可以在任何环境中使用HttpContext功能。

对于我们的单元测试,我们使用了一些从HttpContextBase中重写的stub/mock对象。大多数要使用的对象都有一个接口或基类,可以用来设置连接。为了嘲弄.NET框架,你可以试试Pex&鼹鼠。它应该能够做到这一点,或者我被告知是这样。我自己没有用过,但看起来很整洁!

有一些这样的漂浮物。在大多数情况下,您只需要1或2个配置值,就可以非常有效地计算路径。值#1是web应用程序的根——从那里你可以很容易地构建到任何资源的url。值#2是web应用程序的物理位置,如果这在上下文中很重要的话。