【问题标题】:Session information in .net (asp and webservice).net 中的会话信息(asp 和 web 服务)
【发布时间】:2010-06-03 15:51:31
【问题描述】:

我正在制作一个 .net 组件,生成一个 dll 程序集,该程序集将由 asp.net 站点引用,并在另一个项目中由 asmx webservice 引用。所有代码都是2.0版本。

该组件有一些调用外部 Web 服务的函数,该 Web 服务返回一个对象。例如,其中一个函数是 Login(username, password),它会为此用户生成一个唯一的会话 ID。生成的信息和会话 id 存储在组件的变量中。

网站的问题是: 当用户在前端登录时,我的组件被调用并检查登录并生成会话 ID,我希望当用户浏览到站点中的另一个页面时,我的组件中的该信息仍然存在。

使用我的组件的 Web 服务中的问题是: 我不太关心会话状态,但我希望组件能够正常工作。如果每次调用都会生成一个新的会话 id,那没关系。

这两种环境的组合对我造成了以下问题:

  • 如果不引用 system.web,我就不能在我的组件中使用 asp.net Session() 变量,这有点傻,并且可能在包含我的组件的 Web 服务项目中不可用
  • 我无法将我的组件编程为单例,因为在网站应用程序中,它在所有访问者之间共享,覆盖会话等等
  • 在我的组件中制作一组“会话信息”并对其进行维护,这很难编程(它何时会失效?)并且可能无法在网络农场环境中工作

这种情况有解决办法吗?或者我应该为我的组件创建两个实例,一个用于网站,一个用于 Web 服务?

【问题讨论】:

  • 很遗憾,我无法访问将使用该组件的数据库。

标签: asp.net web-services


【解决方案1】:

也许我不明白你在问什么,但你为什么不能这样做:

Component.Login(user,pass);
Session["Component"] = Component.SessionID

【讨论】:

  • 因为不幸的变量不仅仅是 sessionid,而且因为使用这个原则,我要求使用我的组件的程序员必须确保他也执行会话存储部分(而不是只是使用它的方法并依赖它只是工作)。如果我的组件本身会负责存储,那就更容易了。也许我试图为对方过于简单化?
  • 您还跟踪什么?
  • 一个更大的对象,包含多个值数组等等。有点难以解释究竟是什么,只是一大堆数据.. 但我已经决定,如果用户愿意,他可以传入会话引用,并保存对象。如果他什么都没通过,它就不会得救。我猜两全其美..
【解决方案2】:

我创建了一个额外的类“Factory”,它有一个 .Create(byref Session as HttpSessionState),它查看传入的 session 对象是否为 Nothing,如果不是,它检查其中是否有一个 Component 对象,如果是,它会使用它,如果不是,它会创建它并将其添加到会话中。

在 web 服务调用的情况下,工厂获取 Nothing 参数,因此它不会签入会话对象。它似乎有效。

感谢您的回答!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多