【问题标题】:ASP.NET Session Values Not Being Carried to a Web Service?ASP.NET 会话值没有被传送到 Web 服务?
【发布时间】:2015-03-11 15:17:39
【问题描述】:

我有一个简单的 ASP.NET C# 网页;让我们说default.aspx。那里有一个按钮;单击该按钮在后面的代码中执行以下操作:

Session["groupid"] = 1;

值 1 实际上显示在文本框上。到现在为止还挺好。然后我在 .asmx 文件中也有一个 Web 服务,与 default.aspx 页面处于同一级别。该 Web 服务由 Jquery Ajax 函数调用。我想做的是使用groupid的会话变量做一些sql查询。这是我在 Web 服务中的代码:

[WebMethod(EnableSession = true)]
public string GetRoomDataAttributes()
{
  if (Session["groupid"] != null)//always has no value?
   {
      string session_groupid = HttpContext.Current.Session["groupid"] as string;// *** edit: this should have the value of 1
   }

}

在上面的代码中,Session对象中确实有一个'groupid'键,但是它没有值;它应该有 1 作为值。困扰我的是该值不为空,但没有实际数据。

有什么想法吗?

谢谢。

【问题讨论】:

  • 您在哪里调用/使用或创建 Web 服务的实例..?您能否确认您甚至可以进入 Web 服务代码..?我还建议将 Session["groupid"] = 1; 更改为使用 HttpContext.Current.Session["groupid"] = 1 并在 global.asax OnSessionStart 方法中对其进行初始化。你能提供更多相关的代码吗?在您的代码中显示您正在调用GetRoomDataAttributes()
  • 是的,我可以单步执行 Web 服务代码,这就是它不显示为 null 的原因。基本上,我通过一个标准的 html 按钮使用 Ajax 方法,该按钮调用 .asmx Web 服务,然后我可以逐步完成。在此之前,如果我按下 ASP.NET 按钮手动设置会话,那么只有 Web 服务的 Session 变量不为空。
  • 我认为您需要在 Web Service 内部创建一个属性,然后在为 Web Service 创建实例时,将已初始化的属性值分配给 Session 变量。在我看来,这将是一个简单的解决方案
  • @Meengla “值不为空但没有实际数据”是什么意思?如果不是null,它应该有一些价值——你有没有机会在同一个键下写其他东西?
  • Alexei:是的,这就是我的意思:在会话对象的“键”中,我看到一个键名 groupid,但是当分配给一个字符串变量时,它是空的。

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


【解决方案1】:

问题是您尝试使用 as 运算符将 int 值 (1) 解析为 string

实际上您要问的是:将session_id 设置为会话变量group_id 如果它是一个字符串。好吧,这永远不会是真的,因为它是一个int

您可以直接将其分配给int?,因为它正确地转换了null 值:

int? session_groupid = (int?)HttpContext.Current.Session["groupid"];

【讨论】:

  • 是的,但正如您所见,我在您的答案之前已经给出了自己的答案。你还是给出了解释。我很感激。我的问题是在调试器中我没有看到 groupid 键的任何值。所以我只是尝试将它分配给一个字符串变量,然后在 SQL 中使用;但该字符串变量始终为空。
  • 我知道。您知道如何修复它,但不知道为什么它不起作用。希望我澄清了这一点。
  • 是的。好的,如果您愿意:那么您的代码在做什么?我不太明白?是否将会话变量转换为 Int 类型?什么是'int?在表达式的开头?谢谢。
  • 它是int 类型的可空版本。你也可以在这里使用as,但你不应该因为你知道手头的类型。由于int 不能为空,所以您需要int? 可以。
  • 它直接将会话变量中的值转换为int,如果变量未填充,则可以为null。
【解决方案2】:

ASMX 服务和 ASP.NET 页面实际上并没有使用同一个会话 - 这就是为什么值没有从一个传递到另一个的原因。

当您连接到 Web 服务时,您应该确保您的 Web 服务客户端也将会话令牌从 ASPX 传递到 ASMX。

【讨论】:

  • 我想避免在default.aspx页面中携带会话的组ID;这只是一个测试页;最终调用将来自一个 javascript .js 文件——该文件将首先调用另一个函数以在会话中建立登录凭据。
  • 那么这个 javascript 文件 - 它是否独立地为 Web 服务和 asp 页面建立凭据?两个系统的身份验证机制是否相同?
  • 当前没有javascript文件。 default.aspx 文档是手动建立会话凭据的测试页面。最后一页将是一个 .aspx 页面,主要包含 javascript 代码。其中一些代码将显示一个登录框并将数据传递给 Web 服务,该服务将在会话对象中建立凭据。而且,是的,身份验证是一样的。
  • 稍微修改了问题以显示字符串变量——它没有得到 1 的值
【解决方案3】:

在建立会话变量并使 Web 服务识别会话的键值方面没有问题。我认为我的问题是试图解析值。这是我最终进行的解析:

 if (HttpContext.Current.Session["groupid"] != null)
  {
    int? session_groupid = (int?)Session["groupid"];
  }

弄清楚这一点非常令人沮丧,但学到了一些新东西。谢谢大家的帮助!

HTH。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多