【问题标题】:How to exchange session variables between webmethods in asp.net webservices如何在asp.net webservices中的webmethods之间交换会话变量
【发布时间】:2015-06-17 18:18:13
【问题描述】:

我有以下代码将会话变量存储在一个 webmethod 中并在另一个 webmethod 中检索它,但是当我尝试检索它时该值显示为 null。

[WebMethod(EnableSession = true)]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
 public bool SubmitList1(string businessname )
    {

        Session["Company_Name"] = businessname;  

        SqlConnection con = new SqlConnection();
             .......
           .........
                .........

  }

这将是我尝试检索会话变量的第二个网络方法

[WebMethod(EnableSession = true)]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public bool addresslisting()
    {

        string companyname = (string)Session["Company_Name"];// this particular value is displaying null
       ......
           ........

}

【问题讨论】:

  • 嗯,有什么办法可以避免在这里使用 Session 吗? Web 服务(如 HTTP)应该是无状态的——在 Web 服务中使用会话已经够糟糕的了,更不用说在 2 个不同的 Web 方法之间共享会话了。我不知道这是否可行。 ASP.NET 可能会根据 web 方法对会话进行序列化,因此 cookie 标识符是不同的。您可以在 Web 方法 1 中访问 Session["Company_Name"] 吗?如果是这样,我的猜测可能是正确的。
  • 感谢您的回复,我可以访问 string companyname = (string)Session["Company_Name"];
  • 我可以在 webmethod1 中访问此代码。
  • 我给的解决方案不适合你吗?

标签: c# asp.net web-services asmx


【解决方案1】:

这是对how to exchange session or cookie variables between two webmethods in asp.net webservices 的双重发帖,所以又来了:

免责声明:我认为依赖会话状态的 Web 服务是完全错误的,因为 Web 服务应该是无状态的。然而:

http://msdn.microsoft.com/en-us/library/aa480509.aspx,您可以了解如何在 Web 服务中使用 ASP.NET 会话:

  1. 确保 web.config 中的 /configuration/system.web/sessionState 已正确配置以启用会话状态
  2. 确保使用 Web 服务的 cookie 容器可以存储 ASP.NET 会话 cookie。如果客户端来自 Web 浏览器(例如 ajax 调用),这通常可以开箱即用,但如果您正在构建独立客户端,则必须做更多工作,请参阅上面的链接。

总而言之:一个糟糕的设计决策会给您带来不必要的工作量(抱歉打扰了)。

我认为您应该重新设计您的 Web 服务,以便您始终在所有方法中发送用户名和密码,或者添加一个登录方法,为客户端提供一个随每个 Web 服务请求一起发送的令牌。

【讨论】:

  • 我正在尝试实现一些安全性,当用户成功登录我的 Web 应用程序时,我设置了一个会话变量,以确保调用该方法的用户成功登录到我的 Web 应用程序我检查该会话网络服务上的变量然后只有在他们具有正确权限的情况下才执行网络方法,从你所说的这里我做错了,实现我的目标的正确方法是什么?任何链接或信息将不胜感激,我想以“正确”的方式做到这一点,但我不知道那是什么......
  • 我认为这里的问题是技术的选择。如果用户是 Web 应用程序用户,您从哪里调用 Web 服务?如果您想要的是来自网页的 Web 服务调用,请改为从 javascript 发出 ajax 请求,然后您可以使用您的 Web 应用的身份验证。
  • 这是我需要的,谢谢你的建议:)
【解决方案2】:

我认为您可以在每个 webmethod 上使用:Context.Session["Company_Name"] = businessname 并保留 [WebMethod(EnableSession = true)]

另外,请确保在 web.config 中,配置>system.web>sessionState 模式已启用。如果从 web.config 中关闭 sessionstate,那么 session state 也将无法工作。

如果您不想使用 Session 状态,您可以考虑将值写入 XML 文件,以 UserId/SessionId 作为父元素,然后在需要时读取它。

【讨论】:

  • 写 xml 你的意思是说构造 xml 并将其存储到服务器并从其他 webmethod 访问?
  • 在我的 webconfig 文件中我没有 sessionState 我们需要添加任何库吗?
  • 你需要有:。为此,您无需添加任何参考。保持 sessionState mode="InProc" 将允许您使用将驻留在内存中的 HttpSessionState 对象。将上述配置部分添加到 web.config 中后,请告诉我结果。
  • 写XML,你懂的就是我的意思。 :-)
猜你喜欢
  • 2011-04-12
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
相关资源
最近更新 更多