【问题标题】:Sharing Session between webservice and asp.net application在 webservice 和 asp.net 应用程序之间共享会话
【发布时间】:2023-03-27 09:24:01
【问题描述】:

我有一个 asp.net 应用程序和 webservices (asmx),它们驻留在同一个应用程序中,但不在 aspx 文件的同一个文件夹中。我也有一个使用 web 服务的 winform 应用程序。我已使用 [WebMethod(EnableSession = true)] 标记了 Web 服务方法,但我无法共享 Web 服务中应用程序上的相同会话值。 winform 应用程序可以从应用程序访问 sessionID,我正在使用以下代码

Uri uri = new Uri(ServerServiceUrl);
_cookieContainer = new CookieContainer();
_cookieContainer.Add(new Cookie("ASP.NET_SessionId", SessionID, "/", uri.Host));

我的问题是:我是否遗漏了什么或做错了什么,我无法从 web 服务访问应用程序会话?

【问题讨论】:

  • 为什么需要在 web 服务中使用会话?您是否存储任何临时状态?在这种情况下,IMO 服务应该是无状态的,因此,您的问题将不存在......
  • 同意,你需要考虑像静态类这样的网络服务
  • 我的 aspx 服务,就像应用程序一样,与 java webservices 对话,当应用程序调用服务时,它会缓存一段时间的值。我不想一遍又一遍地调用 java 服务,我想使用应用程序缓存的数据。因此,我为什么要分享会话。

标签: asp.net session web-services c#-2.0 sharing


【解决方案1】:

您是否尝试过从System.Web.SessionState.IRequiresSessionState 继承您的网络服务类?

它通常用于 http 处理程序,但 web 服务似乎使用相同的标记接口。

【讨论】:

  • 我没有尝试过,但据我了解,通过在每个方法上添加 [WebMethod(EnableSession = true)] 可以使它们启用会话。我确实有一个可用的会话变量,只是它是一个新会话,而不是该会话已经在应用程序上创建。
  • 刚刚意识到。您是否从同一台机器访问网络服务?在这种情况下,您确定在设置 cookie 时应该使用“uri.Host”而不是环回接口吗?
【解决方案2】:

我无法解释为什么你不能让 winforms 应用程序“劫持”会话 - 你正在做的事情看起来应该完全符合你的要求。

我只想建议您使用应用程序缓存(缓存来自您的 java 服务的响应)而不是用户的会话存储。这有以下优点:-

  • a) 如果缓存信息适用于多个用户(例如访问受控),则相同的缓存信息可用于多个用户,而不是为每个会话获取。
  • b) 与使用会话数据相比,您可以更好地控制缓存的时间/何时清除它们(会话数据仅存在于会话的生命周期中,如果您忘记删除,则存在增长和增长的危险旧信息)
  • c) 如果您无法让会话劫持工作,您仍然可以从任何会话访问缓存中的数据。

【讨论】:

    猜你喜欢
    • 2018-12-24
    • 2011-02-02
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2021-06-26
    相关资源
    最近更新 更多