无法添加对System.Web.Hosting的引用

16

我正在将一个 Web 应用程序从 VB 迁移到 C#,并且我已经升级到 VS2013 的 Update 3。 Hosting 类有所更改吗?我在使用 Hosting.HostingEnvironment.MapPath 时遇到了错误,并且我甚至无法添加对 System.Web.Hosting 的引用,因为它找不到。当我尝试在添加引用时搜索程序集时,使用整个命名空间即 System.Web.Hosting,它没有返回结果。

我在类中有使用语句,并且它没有变灰,这意味着它被用于某些东西,但是代码不喜欢 Hosting.HostingEnvironment 中的 Hosting,因为它是醒目的红色。即使在 IntelliSense 中我也没有得到 Hosting 类,并且该项目已引用 System.Web

5个回答

9

没有Hosting类。相反,您需要的是HostingEnvironment类:

HostingEnvironment.MapPath("~/Hello.txt");
HostingEnvironment的完整类型是System.Web.Hosting.HostingEnvironment,因此您需要在文件中使用using System.Web.Hosting;子句,或者使用完整名称。
更重要的是,如果您正在制作Web应用程序,则很可能不想使用HostingEnvironment。您应该始终拥有例如HttpContextPage/Control的实例,这将使您可以访问Server.MapPath,这应该是首选。
至于引用,System.Web.Hosting命名空间位于System.Web.dll中,因此请确保您已引用该dll并且一切顺利。
由于您从VB迁移,我假设冲突是由VB对命名空间的不同处理方式引起的。在C#中,您不能只这样做:
using System.Web;

Hosting.HostingEnvironment.DoWhatever();

当使用命名空间时,要么使用包括命名空间的完整类型名称,要么在确切的命名空间和类型上使用 using。将两者组合在一起不太可行。


3

我曾遇到过同样的问题,但解决方法与已发布的不同。我在一个独立的(Model)项目中查看库中的代码。在我使用的库项目中,没有引用System.Web。

棘手的部分是,System.Web.Http被引用,因此找到了System.Web命名空间,所以语句using System.Web;编译正常。

为了避免麻烦和心痛,请始终按照此答案中所示的方式,在“解决方案资源管理器”中按下“与活动文档同步”按钮。https://dev59.com/_2cs5IYBdhLWcg3wp1lW#30517179


顺便提一下,Model类需要System.Web.Hosting来使用HostingEnvironment.QueueBackgroundWorkItem抛出异步的“Fire&Forget”消息,以防止IIS回收工作进程时异常被终止。 - Michael Blackburn

1

我认为你不能使用.NET客户端框架构建Web应用程序?

无论如何,不管那些。你会发现命名空间在不同的程序集中被重复使用。尤其是在框架程序集中,他们认为一些类在概念上属于一起,即使它们支持不同的技术。

我不确定我解释得很好,但以这个例子为例。mscorlib、System、System.Net、System.Core和System.Numerics中都有一个System命名空间。此外,System.Web可能出现在System.Web.Http、System.Web本身以及其他如System.Web.Abstractions、System.Web.Optimization等中。因此,仅尝试使用using语句来确定特定类来自哪个程序集可能会让你感到困惑。

System.Web.Hosting命名空间中的典型类位于框架程序集System.Web.dll中。Microsoft一直在试图淡化直接使用System.Web.dll,而更倾向于Katana/Kestrel的更模块化实现。

话虽如此,请确保您的项目直接引用System.Web.dll。要使用所需的类,请使用完整名称,即System.Web.Hosting.HostingEnvironment。或者在.cs文件开头放置一个using System.Web.Hosting;

当前类中可能存在名为HostingEnvironment的属性,或者在另一个程序集的另一个命名空间中存在名为HostingEnvironment的类。在这种情况下,您可能需要完整指定类名或者创建一个易于引用和减少输入的简称。

例如,您可以在文件开头添加以下内容:

using HostEnv = System.Web.Hosting.HostingEnvironment;

然后在您的代码正文中的某个地方,您可以这样引用它:

var appHost = HostEnv.ApplicationHost;

这对您有帮助吗?

针对您想要解决的特定情况,您可以这样做:

var resolvedPath = HostEnv.MapPath(pathToMap);

1

1
那并没有真正解决问题,对吧?如果 OP 需要使用该类/命名空间的另一个成员怎么办? - user247702
@Stijn 可能是因为没有 Hosting 类? - mybirthname
这是我遇到的问题,我需要 HostingEnvironment 类中的 QueueBackgroundWorkItem 方法。我可以在对象浏览器中看到命名空间、类和方法,但当引用 System.Web.Hosting 的 4.5.2 版本时,我的代码找不到它。 - Michael Blackburn
@Michael,为什么不考虑使用4.5.1程序集或者直接跳到4.6.1呢?我发现针对4.5.2的目标通常会出现问题。 - Eniola
在我的情况下,Sharepoint 2013与4.6不兼容。但我肯定感受到了针对4.5.2的“压力”。我正在查看我的WebAPI项目中的引用,但我要查看的代码位于一个没有这些引用的不同库项目中。我已经添加了一个回答来记录这个问题。 - Michael Blackburn

-1

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