【问题标题】:Why is Visual Studio 2010 mixing up System.Web And System.Web.Abstractions?为什么 Visual Studio 2010 混淆了 System.Web 和 System.Web.Abstractions?
【发布时间】:2010-09-30 21:14:54
【问题描述】:

Visual Studio 2010 似乎混合了上述库。

此代码示例来自 Steven Sanderson 的“Pro ASP.NET MVC2 Framework”一书。

[TestMethod]
public void HomePage_Recognizes_New_Visitor_And_Sets_Cookie() 
{
    // Arrange: First prepare some mock context objects
    var mockContext = new Mock<HttpContextBase>();
    var mockRequest = new Mock<HttpRequestBase>();
    var mockResponse = new Mock<HttpResponseBase>();

    // The following lines define associations between the different mock objects
    // (i.e. tells Moq what alue to use for tMockContext.Request)
    mockContext.Setup(x=> x.Request).Returns(mockRequest.Object);
    mockContext.Setup(x=> x.Response).Returns(mockResponse.Object);
    mockRequest.Setup(x=> x.Cookies).Returns(new HttpCookieCollection());
    mockResponse.Setup(x=> x.Cookies).Returns(new HttpCookieCollection());

    var homeController = new HomeController();
    var requestContext = new RequestContext(mockContext.Object, new RouteData());
    homeController.ControllerContext = new ControllerContext(requestContext, homeController);

    // Act
    ViewResult viewResult = homeController.HomePage();

    // Assert
    Assert.AreEqual(String.Empty, viewResult.ViewName);
    Assert.IsTrue((bool)viewResult.ViewData["IsFirstVisit"]);
    Assert.AreEqual(1, homeController.Response.Cookies.Count);
    Assert.AreEqual(bool.TrueString, homeController.Response.Cookies["HasVisitedBefore"].Value);
}

我的项目引用了 System.Web 和 System.Web.Abstractions 库。

当代码文件只是“使用 System.Web”时,我得到两个错误:

  1. (“断言”一词下的第 25 行)类型“System.Web.HttpResponseBase”在未引用的程序集中定义。您必须添加对程序集“System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”的引用。
  2. (“Cookies”一词下的第 25 和 26 行)“System.Web.HttpResponseBase”不包含“Cookies”的定义,并且没有扩展方法“Cookies”接受“System.Web.HttpResponseBase”类型的第一个参数' 可以找到(您是否缺少 using 指令或程序集引用?)

如果我将“使用 System.Web.Abstractions”添加到代码文件并构建项目,上述错误就会消失,但随后会出现以下错误:

  1. 命名空间“System.Web”中不存在类型或命名空间名称“Abstractions”(您是否缺少程序集引用?)

有趣的是,在这两种情况下,当我在 Response 之后放置一个点时,Intellisense 都会提示我正确的选择(即 Response.Cookies)。似乎 Intellisense 具有构建引擎没有的有关 HttpResponseBase 的信息。

知道是什么原因造成的吗?

【问题讨论】:

    标签: asp.net-mvc visual-studio-2010


    【解决方案1】:

    您能否仔细检查一下您的项目引用下是否同时拥有System.WebSystem.Web.Abstractions

    使用从 Apress 网站下载的书的源代码,我可以毫无错误地构建您的代码,但是当我删除对 System.Web.Abstractions 的引用时,我会得到相同的行为,包括您提到的智能感知信息提示。

    【讨论】:

    • 这是一个错过的参考。我在我的 WebUI 项目而不是 UnitTests 项目中查看 System.Web.Abstractions 参考。谢谢。这种行为仍然有点奇怪。
    【解决方案2】:

    问题在于包装器类型(HttpContextWrapper 和朋友)存在于名为 System.Web.Abstractions 的程序集中,但位于 System.Web 命名空间中(这就是为什么在此处添加 using 语句不是解决方案的原因) .

    using System.Web 留在那里,并确保您(在项目文件中)有对 System.Web.Abstractions 程序集的引用,一切都应该没问题。

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      相关资源
      最近更新 更多