在ASP.NET MVC中的静态字段中使用Server.MapPath()

125

我正在构建一个使用Lucene.Net进行搜索查询的ASP.NET MVC网站。我在这里提出了一个问题,询问如何在ASP.NET MVC应用程序中正确地组织Lucene.Net的使用方式,并被告知最好的方法是将我的IndexWriter声明为public static,以便可以重复使用。

这里是我SearchController顶部的一些代码:

public static string IndexLocation = Server.MapPath("~/lucene");
public static Lucene.Net.Analysis.Standard.StandardAnalyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer();
public static IndexWriter writer = new IndexWriter(IndexLocation,analyzer);

由于 writer 是静态的,IndexLocation 也必须是静态的。 因此,编译器为 Server.MapPath() 给出以下错误:

需要对象引用才能访问非静态字段、方法或属性“System.Web.Mvc.Controller.Server.get”。

有没有一种方法可以从静态字段中使用 Server.MapPath() 或类似的内容?我该如何修复这个错误?

2个回答

251

这个函数给了我一个错误,因为HostingEnvironment.MapPath返回的结果与Server.MapPath不同,后者返回绝对URL而不是相对URL。 - John
@John,我得到了相同的值。 - ps2goat

55

我认为你可以尝试这个方法,在课堂上打电话

 System.Web.HttpContext.Current.Server.MapPath("~/SignatureImages/");

*对不起,我疏忽了,关于静态函数的问题已经被adrift回答了。*

System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/");

更新

在使用 System.Web.Hosting.HostingEnvironment.MapPath("~/SignatureImages/"); 时,我遇到了一个异常。

异常详情:System.ArgumentException: 相对虚拟路径“SignatureImages”不允许在此处。at System.Web.VirtualPath.FailIfRelativePath()

解决方案(已在静态 WebMethod 中测试)

System.Web.HttpContext.Current.Server.MapPath("~/SignatureImages/"); 已经生效。


1
我曾经看到你在更新中提到的错误,只有当代码使用相对虚拟路径时才会出现这种情况。例如,Server.MapPath()允许使用"path/to/file"这样的路径。它使用当前上下文来确定当前页面的路径,例如,然后从那里创建相对路径。如果我们在~/Subfolder/Page1.aspx中,URL将从~/Subfolder/files/file1.doc映射。HostingEnviornment.MapPath()是静态的,因此始终需要完整的虚拟路径,以~/作为URL的起始部分。 - ps2goat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接