在调用 ASMX Web 服务时保持会话

Posted

技术标签:

【中文标题】在调用 ASMX Web 服务时保持会话【英文标题】:Maintain Session While Calling an ASMX Web Service 【发布时间】:2011-12-19 04:39:53 【问题描述】:

我正在使用客户端应用程序连接到仅用于经过身份验证的用户的 Web 服务。这是最简单的例子: 我的网络服务代码:

public class TestService : System.Web.Services.WebService

    [WebMethod(EnableSession = true)]
    public string WelcomeMsg()
    
        return "Hello: " + Session["UserName"] + "! Welcome to our store.";
    

    [WebMethod(EnableSession = true)]
    public void SetUserName(string sName)
    
        Session["UserName"] = sName;
    

这是我在客户端应用程序上的代码(Windows 表单,而不是 Web 库):

private void btnSetName_Click(object sender, EventArgs e)

    TestService.TestService ws = new TestService.TestService(); //Create a web service
    MainForm.m_ccSessionInfo = new System.Net.CookieContainer(); //Create a CookieContainer
    ws.CookieContainer = MainForm.m_ccSessionInfo; //Set CookieContainer of the web service
    ws.SetUserName(txtUserName.Text); //Set value of session 
    ws = null;


private void btnWelcome_Click(object sender, EventArgs e)

    TestService.TestService ws = new TestService.TestService(); //Create a web service
    ws.CookieContainer = MainForm.m_ccSessionInfo; //Set CookieContainer back
    string sWelcome = ws.WelcomeMsg(); //Get value from session property
    ws = null;

    System.Diagnostics.Debug.WriteLine(sWelcome); 

在我的示例中 MainForm.m_ccSessionInfo 是一个静态成员,我想将会话 cookie 值保留在这个成员中! 但是,它不起作用:(。ws.WelcomeMsg() 总是返回一个空字符串。

【问题讨论】:

【参考方案1】:

糟糕,我想我刚刚找到了解决这个问题的方法。 CookieContainer 由服务器创建,必须保存在客户端应用程序中。在 btnSetName_Click 上,我改变了

MainForm.m_ccSessionInfo = new System.Net.CookieContainer(); //Create a CookieContainer
ws.CookieContainer = MainForm.m_ccSessionInfo; //Set CookieContainer of the web service

进入

ws.CookieContainer = new System.Net.CookieContainer(); //Create a CookieContainer
MainForm.m_ccSessionInfo = ws.CookieContainer; //Keep CookieContainer for later using

现在效果很好!谢谢大家。

【讨论】:

是的!!!!我必须为 ASMX Web 服务维护一些遗留代码,这解决了我的问题!谢谢!【参考方案2】:

下面试试

private void btnWelcome_Click(object sender, EventArgs e)

    TestService.TestService ws = new TestService.TestService(); //Create a web service
    ws.SetUserName(txtUserName.Text); 
    string sWelcome = ws.WelcomeMsg();
    System.Diagnostics.Debug.WriteLine(sWelcome); 

当调用 btnSetName_Click 方法和 btnWelcome_Click 单击 web 服务时,将您的 reqwests 视为新会话。

【讨论】:

"当调用 btnSetName_Click 方法和 btnWelcome_Click 单击 web 服务时,将您的 reqwests 视为新会话。"是的,这是我的问题,我想为客户端应用程序的所有活动保留会话。谢谢你的回复。 这不是解决问题的办法。

以上是关于在调用 ASMX Web 服务时保持会话的主要内容,如果未能解决你的问题,请参考以下文章

为啥当android在java中调用第二次Web服务时会创建新的会话

保持 HttpUrlConnection 调用之间的会话(本机/Webview)

web会话管理

保持 ASP.NET 会话打开/活动

会话保持解决方案及NetScaler会话保持概述

在 Ajax 调用期间保持 ASP.Net 会话处于活动状态