代码之家  ›  专栏  ›  技术社区  ›  Jason

为什么Visual Studio 2010混合了System.Web和System.Web.Abstractions?

  •  6
  • Jason  · 技术社区  · 14 年前

    Visual Studio 2010似乎正在混合上述库。

    此代码示例来自StevenSanderson的《Pro ASP.NET MVC2框架》一书。

    [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库。

    当代码文件只有“using system.web”时,我会得到两个错误:

    1. (单词“assert”下的第25行)“system.web.httpResponseBase”类型是在未引用的程序集中定义的。必须添加对程序集“system.web.abstractions,version=3.5.0.0,culture=neutral,publickeytoken=31bf3856ad364e35”的引用。
    2. (单词“cookies”下的第25行和第26行)“system.web.httpResponseBase”不包含“cookies”的定义,并且找不到接受“system.web.httpResponseBase”类型的第一个参数的扩展方法“cookies”(是否缺少using指令或程序集引用?)

    如果我将“using system.web.abstractions”添加到代码文件并构建项目,则上述错误会消失,但随后会得到以下错误:

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

    有趣的是,在两种情况下,当我在响应后放置一个点时,IntelliSense会提示我正确的选择(即response.cookies)。似乎IntelliSense有关于httpResponseBase的信息,而构建引擎没有。

    知道是什么引起的吗?

    2 回复  |  直到 8 年前
        1
  •  8
  •   Jeff Ogata    14 年前

    你能再检查一下你的项目参考文件中是否都有 System.Web System.Web.Abstractions ?

    使用从apress站点下载的图书的源代码,我可以构建没有错误的代码,但是当我删除对 system.web.摘要 ,我得到相同的行为,包括您注意到的IntelliSense信息提示。

        2
  •  4
  •   Matt Enright    14 年前

    问题是包装器类型( HttpContextWrapper 和friends)位于名为system.web.abstractions的程序集中,但位于system.web命名空间中(这就是为什么在此处添加using语句不是解决方案)。

    离开 using System.Web 在那里,确保您有一个对system.web.abstractions程序集的引用(在项目文件中),并且一切都应该正常。