C# 为什么SessionID不同?

C# 为什么SessionID不同?,c#,asp.net,web-services,session,C#,Asp.net,Web Services,Session,我有一个具有以下方法的ASMX web服务: [WebMethod(Description = "Test", EnableSession = true)] public string DoWork(string param) { string user = Session["user"].ToString(); } 当我使用AJAX从客户端调用此方法时,SessionId保持不变(对于aspx页面和web服务),但当我从服务器端代码调用此方法时(在按钮单击事件上),SessionId会

我有一个具有以下方法的ASMX web服务:

[WebMethod(Description = "Test", EnableSession = true)]
public string DoWork(string param)
{
   string user = Session["user"].ToString();
}
当我使用AJAX从客户端调用此方法时,SessionId保持不变(对于aspx页面和web服务),但当我从服务器端代码调用此方法时(在按钮单击事件上),SessionId会发生更改:

ServiceReference1.MyServiceSoapClient obj = new ServiceReference1.MyServiceSoapClient();
string user=Session["user"];
obj.DoWork("Test string"); 
为什么SESSIONID会改变?
如何保持两者相同?

您是否考虑过在每种情况下从何处拨打电话?在服务器端调用中,您从服务器调用自身,因此创建了一个新会话,而在另一种情况下,您使用的是相同的客户端,因此会话在这种情况下不会更改

如果您需要更清楚地描述这一点,请从web服务的角度来看这一点。在一种情况下,客户端是web浏览器,而在另一种情况下,客户端是自身,这是不同的,因此应该更改SessionID


假设服务器有一个很好的理由来查询它自己,我可能会考虑添加一个参数给WebService,它可以通过一些数据来共享,否则您将拥有劫持会话的能力。



如果web服务和aspx页面位于同一台服务器上,那么web服务访问的任何功能都可以在web页面的代码隐藏中直接访问。您可以将web服务中“DoWork”方法的逻辑放入一个DLL中,web页面和web服务都可以访问该DLL,并且不允许更改SessionID,因为请求中提供的是同一个客户端。

好的,那么我如何保持它们不变呢?@user1390378为什么要让服务器通过设计为面向外部API的SOAP调用来调用自己的代码?如果代码已经在服务器端运行,为什么不直接调用预期的函数呢?@MerickOWA:如何,你能举个例子吗?