2011-11-01 59 views
6

我正在使用客户端应用程序连接到仅用于已验证用户的Web服务。这是最简单的例子:
我的web服务代码:在调用ASMX 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形式,而不是网络基础):

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()总是返回一个空字符串。

回答

8

新的会话。哎呀,我想我只是发现这个问题的解决方案。该的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 

而且现在工作得很好!谢谢大家。

+0

YESSSSSS !!!!我必须为ASMX Web服务维护一些遗留代码,这解决了我的问题!谢谢! –

1

试试下面

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点击网ervice考虑您的reqwests作为

+0

“当调用btnSetName_Click方法和btnWelcome_Click时,请单击webs服务将您的请求视为新会话。”是的,那是我的问题,我想保留客户端应用程序的所有活动的会话。感谢您的答复。 – huynhtuanh