IIS7 上的 Spring.NET 和 MVC3 - 会话范围行为

2023-12-22

可能这是一个愚蠢的问题,我根本不明白 Spring 和 IIS 是如何工作的,但让我们尝试一下。

我对 ASP.NET 很陌生,据我了解,会话处理类似于 Apache/PHP:

会话在浏览器的选项卡之间共享,但不在不同浏览器之间共享。 IE。如果我在 Firefox 中打开页面并将某些东西放入购物车,购物车仍将在另一个选项卡中包含我的商品,但在 Internet Explorer 中打开同一页面应该会显示一个空购物车。

但是我无法使用 Spring.NET 重现此行为。

我用购物车对象创建了一个 hello-world,该对象在会话范围中注明:

<objects xmlns="http://www.springframework.net">
  <object id="shoppingCart" type="DemoShop.Models.Cart.ShoppingCart, DemoShop" singleton="true" scope="session" />
</objects>

如果我将某些东西添加到购物车中,它会在任何选项卡和浏览器中持续存在。所以在我看来,这个对象好像是一个真正的单例,因此在 IIS 应用程序运行时是持久的。

我知道,你要说的是:我为什么使用该属性singleton="true"在我的弹簧配置中?好吧,如果我删除它或将其设置为false,那么该对象将不会保留在会话中,而是会在每次请求时重新创建,从而丢失其数据。

Spring.NET 文档没有讨论singleton属性在 MVC 上下文中根本没有,我花了一些时间才弄清楚,使用 MVC3 似乎需要它。

我能够使用成功创建应用程序范围对象

<object id="..." type="..., ..." singleton="true" scope="application" />

和请求范围对象使用

<object id="..." type="..., ..." scope="request" />

or

<object id="..." type="..., ..." singleton="false" scope="request" />

然而离开singleton属性 out,始终将我的对象放在请求范围中,无论我实际在哪个范围中注意到scope属性。

我的猜测是,该会话实际上并未在 Firefox 和 IE 之间共享,但购物车对象只是在应用程序范围内,因为我使用 spring 的方式错误。

任何人都可以给我建议或提示我做错了什么或者这是 IIS7 中的问题吗?


这是一个错误。

经过对 spring.net 源代码的一些过度调试,我们发现:

  1. 对会话范围对象的支持由spring.web dll
  2. The spring.web.mvcdll不依赖于spring.web
  3. 这意味着,不可能实例化MvcApplicationContext可以解析会话范围的对象

以下解决方案显示了一个自定义的MvcApplicationContext使用 spring.net 完全启用 MVC3 中的会话范围对象。

标准应用程序上下文无法解析 Web 范围的原因是它使用了该类RootObjectDefinition维斯不知道scope属性(在配置 xml 中)。这WebApplicationContext相反实例化RootWebObjectDefinition类型,知道范围。

The WebObjectsFactory覆盖该方法CreateRootObjectDefinition它返回的实例RootWebObjectDefinition。这就是我们想要从应用程序上下文中返回的内容。这是通过重写方法来完成的CreateObjectsFactory.

接下来,我们要重写的是方法CreateXmlObjectDefinitionReader。当 spring 从配置中读取元数据时,它不会解析其他属性,例如scope如果我们不选择特定的读者。因此我们将使用WebObjectDefinitionReader在我们的应用程序上下文中。

对于会话范围对象的配置,您可以省略singleton属性或将其显式设置为true。否则具有价值false会话范围肯定会被禁用。

EXAMPLE:

<objects xmlns="http://www.springframework.net">
    <object id="shoppingCart" type="ShoppingCart, ..." singleton="true" scope="session" />
</objects>

分步解决方案:

  1. Create MvcWebApplicationContext继承自MvcApplicationContext。您将需要重写上面提到的两个方法并创建默认构造函数。
  2. 创建一个MvcWebContextHandler继承自MvcContextHandler。这将触发我们的自定义应用程序上下文将被使用。
  3. 在您的中使用自定义上下文处理程序web.config.
  4. 对于 IIS6 支持或 Visual Studio 内置 Web 服务器:添加WebSupportModule to system.web部分。
  5. 对于 IIS7 支持:添加WebSupportModule to system.webserver部分。

网络配置:

<configSections>
    <sectionGroup name="spring">
        <section name="context" type="YourNamspace.MvcWebContextHandler, YourAssembly"/>    
        ....
    </sectionGroup>    
    ....
</configSections>

<!-- IIS6 -->
<system.web>
    <httpModules>
        <add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
    </httpModules>
</system.web>

<!-- IIS7 -->
<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true" >
        <add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
    </modules>
</system.webServer>

自定义应用程序上下文类:

public class MvcWebApplicationContext: MvcApplicationContext {

    public MvcWebApplicationContext(string name, bool caseSensitive, params string[] configurationLocations)
    : this(new MvcApplicationContextArgs(name, null, configurationLocations, null, caseSensitive))
    { }

    public MvcWebApplicationContext(string name, bool caseSensitive, IApplicationContext parentContext, params string[] configurationLocations)
    : this(new MvcApplicationContextArgs(name, parentContext, configurationLocations, null, caseSensitive))
    { }

    public MvcWebApplicationContext(MvcApplicationContextArgs args)
    : base(args)
    { }

    public MvcWebApplicationContext(string name, bool caseSensitive, string[] configurationLocations, IResource[] configurationResources)
    : this(new MvcApplicationContextArgs(name, null, configurationLocations, configurationResources, caseSensitive))
    { }

    public MvcWebApplicationContext(params string[] configurationLocations)
    : this(new MvcApplicationContextArgs(string.Empty, null, configurationLocations, null, false))
    { }

    protected override XmlObjectDefinitionReader CreateXmlObjectDefinitionReader(DefaultListableObjectFactory objectFactory)
    {
        return new WebObjectDefinitionReader(GetContextPathWithTrailingSlash(), objectFactory, new XmlUrlResolver());
    }

    protected override DefaultListableObjectFactory CreateObjectFactory()
    {
        return new WebObjectFactory(GetContextPathWithTrailingSlash(), IsCaseSensitive);
    }

    private string GetContextPathWithTrailingSlash()
    {
        string contextPath = this.Name;
        if (contextPath == DefaultRootContextName)
        {
            contextPath = "/";
        }
        else 
        {
            contextPath = contextPath + "/";
        }
        return contextPath;
    }
}

自定义上下文处理程序类:

public class MvcWebContextHandler : MvcContextHandler {

    protected override Type DefaultApplicationContextType
    {
        get { return typeof(MvcWebApplicationContext); }
    }  
}

我们将此错误添加到 Spring.NET 的问题跟踪器中:https://jira.springsource.org/browse/SPRNET-1450 https://jira.springsource.org/browse/SPRNET-1450

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IIS7 上的 Spring.NET 和 MVC3 - 会话范围行为 的相关文章

  • 如何使用 Asp.Net MVC 3 和 Razor 获得特定于视图的 内容?

    除了 Layout cshtml 中已链接的内容之外 我还想在某些视图中链接特定的样式表 对于非 Razor 我看到使用内容占位符 我该如何为 Razor 执行此操作 Razor 中的内容占位符相当于部分 在你的 Layout cshtml
  • 来自 RAZOR 中不同文件夹的 RenderPartial

    我一直在尝试将我的 aspx 页面转换为 cshtml 并且在从另一个文件夹渲染部分页面时遇到问题 我以前做过的事 我认为等价的是 Html RenderPartial Views Inquiry InquiryList cshtml Mo
  • 链接“let”语句时使用“and”还是“in”更好?

    我意识到这可能是一个愚蠢的问题 但是 如果我把一堆let不需要需要了解彼此价值观的语句 使用是否更好and or in 例如 以下哪一个更可取 如果有 let a foo and b bar and c baz in etc or let
  • CodeIgniter,将数据从模型传递到控制器以在视图中使用

    我想将模型中查询的数据传递给控制器 为此我使用 return data 然后在我使用的控制器中 this gt load gt view my view data 据我了解var dump data 视图中应该显示查询的结果 事实并非如此
  • 在asp.net mvc 3项目中渲染部分视图onclick

    在我的 mvc 项目中 我有一个简单的项目列表 其中包含如下的增删改查操作 tbody foreach var item in Model tr td item Title td td item Body td td item Price
  • 在 Python 2.6 中访问外部作用域

    比如说 我有一些带有变量的作用域 并且在此作用域中调用的函数想要更改一些不可变变量 def outer s qwerty n 123 modify def modify s abcd n 456 是否有可能以某种方式访问 外部范围 就像是n
  • 如何使用 MVC 属性验证列表是否具有大于零的非空元素?

    我正在尝试实现一个可以获取不同数量的文件的文件上传器 文件输入元素的名称都相同 因此会生成 MVC3 乐意绑定的文件列表 所以在我的控制器中我有 public virtual ViewResult UploadReceive IEnumer
  • 如何将动态数据写入 MVC 3 Razor 中的页面布局?

    我有带有 Razor 引擎的 MVC 3 C 项目 将动态数据写入 Layout cshtml 的方法和最佳实践是什么 例如 也许我想在网站的右上角显示用户名 该名称来自会话 数据库或基于用户登录的任何内容 更新 我也在寻找将某些数据渲染到
  • jQuery异步ajax查询和返回值问题(范围、闭包)

    由于异步查询和变量范围问题 代码无法正常工作 我不明白如何解决这个问题 使用 async false 更改为 ajax 方法 不是一个选项 我知道闭包 但我如何在这里实现它 不知道 我已经在这里看到了有关 js 中的闭包和 jQuery 异
  • PowerShell Group-Object 不再将对象拆分为固定大小的集合

    我在一个脚本中写了这个 我认为该脚本运行良好 但似乎已停止工作 testList object 1 object 2 object 3 object 4 object 5 counter 0 maxSize 2 groupedList te
  • 为什么使用自动激活文件句柄的三参数开放调用是 Perl 最佳实践?

    我有两个关于 Perl 的问题open功能 1 我好像记得从Perl 最佳实践的 3 参数版本open比两个参数版本更好 例如 open OUT gt gt file vs open OUT gt gt file 这是为什么 前几天我试图告
  • 如何在单个 Razor 视图中编辑多个模型

    我是 MVC3 的新手 我有多个模型 例如BussinessDetails ContactPerson ServiceArea Address以及更多型号 我有一个单一的视图页面 其中共享视图页面如Contacts BusinessDeta
  • ASP.NET MVC 3,如何正确制作主题

    我正在寻找有关如何以最佳方式在 MVC 3 中实现 主题 的输入 我想需要一个自定义视图引擎来负责定位视图文件等 我还希望主题系统是可扩展的 这样 如果它只是其中一个视图 我想更改其他视图 但仍使用默认值 有点像 Orchard 项目吗 想
  • JavaScript - 声明嵌套函数的全局作用域?

    我尝试为嵌套 JavaScript 函数提供全局范围的尝试不起作用 DECLARE FUNCTION B IN GLOBAL SCOPE function B function A DEFINE FUNCTION B INSIDE NEST
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • 绑定到 ViewModel 时如何更新 Model?

    我有一个 HttpPost 操作方法签名如下 HttpPost public ActionResult Edit ExistingPostViewModel model Save the edited Post 现在 在过去 当我没有使用
  • 复杂对象MVC3的JSON序列化

    我有一个问题 我似乎不知道如何序列化类型的对象 public class SchedulingCalendarMonth public List
  • 如何将 Razor 视图转换为字符串?

    我想使用我的 Razor 视图作为某种发送电子邮件的模板 所以我想将我的模板 保存 在视图中 将其作为字符串读入控制器 进行一些必要的替换 然后发送它 我有有效的解决方案 我的模板作为 HTML 页面托管在某处 但我想将其放入我的应用程序中
  • 将整个包传递给雪簇

    我正在尝试并行化 使用snow parLapply 一些依赖于包 即除snow 调用函数中引用的对象parLapply必须使用显式传递给集群clusterExport 有没有办法将整个包传递到集群 而不必显式命名每个函数 包括用户函数调用的
  • 使用自定义VirtualPathProvider加载嵌入资源部分视图

    我编写了自定义 VirtualFile 和 VirtualPathProvider 实现 它们成功获取了部分视图的嵌入式资源 但是 当我尝试渲染它们时 它会产生以下错误 The view at Succeed Web Succeed Web

随机推荐