代码之家  ›  专栏  ›  技术社区  ›  JL. Hans Passant

可能欺骗httpcontext.current?

c#
  •  4
  • JL. Hans Passant  · 技术社区  · 15 年前

    我在程序集中有这行代码:

     HttpContext.Current.Server.MapPath
    

    如果在Web服务中使用程序集,这将非常有用。

    但是如果我把它从Web服务中去掉,它肯定不会工作,因为httpContext不存在。

    是否有可能愚弄httpcontext以为它存在,而仅仅是为了得到目录的相对路径结构?

    我的意思是手动创建httpcontext对象,并为其分配一个基目录?

    更新

    对于:httpcontext.current.server.mappath是否有更通用的方法?

    可以在可执行文件中工作,也可以在Web中工作?

    5 回复  |  直到 15 年前
        1
  •  6
  •   sisve    15 年前

    HttpContext.Current 得到或 集合 httpContext对象“”。并且httpContext有一个公共构造函数,它接受httpWorkerRequest(abstract,use simpleWorkerRequest),您可以完全伪造httpContext。

    我同意其他人的看法,您可以重构代码以删除此依赖项,但在某些情况下,您必须伪造httpContext。当前的内容,在这种情况下,如果您搜索,将显示此问题…

        2
  •  5
  •   Michael Ciba    15 年前

    在我看来,您需要将对httpContext的调用包装在另一个对象中,然后您可以使用ioc在正确的环境中切换到正确的对象。例如,将imappath作为接口,然后实现为httpmappath或consoleappmappath等。

        3
  •  1
  •   Paul    15 年前

    在编写使用httpContext.current的单元测试时,我们做了类似的事情。我们有一个名为ihttpContext的接口,它包含了我们从普通httpContext需要的一切。然后,我们没有调用httpContext.current,而是有一个扩展方法(httpContext.current.make())返回这个IHttpContext接口。

    在扩展方法中,我们可以决定httpContext.current是否可用,如果不可用,那么我们可以手动构建一个“可测试”对象并返回它。

    当然,这扩展到如果你在使用iRequest、iResponse等对象,就必须编写它们,但我认为这是可以预料的。

        4
  •  1
  •   ceesjm1    15 年前

    不确定这是否有帮助,但我在为ASP.NET Web应用编写一些单元测试时遇到了类似的问题。在某个API调用中的某个时刻,httpContext.current.xxxxx正在设置一个不在范围内的属性。我发现答案是在单元测试中添加以下属性:

    [测试方法()]
    [主机类型(“ASP.NET”)]
    [urltotest(” http://mytestsite.com/Home.aspx “”

    original article

        5
  •  0
  •   klashar    15 年前

    这些代码是特定于网站的。我不明白为什么它属于商业逻辑。

    可能需要重新考虑此代码将排除 HttpContext 从业务逻辑将是最好的解决方案。例如,您可以接受文件路径作为方法参数,而不是在业务逻辑中解析它。