2011-11-01 15 views
6

Sto utilizzando un'app client per connettersi a un servizio Web solo per utenti autenticati. Ecco esempio più semplice:
Il mio codice servizio web:Mantieni sessione durante la chiamata a un servizio Web ASMX

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; 
    } 
} 

Ecco il mio codice sul client app (sotto forma di Windows, non web di base):

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); 
} 

Nel mio esempio è un MainForm.m_ccSessionInfo membro statico, voglio mantenere il valore dei cookie di sessione in questo!
Tuttavia, non funzionano :(. La ws.WelcomeMsg() è sempre restituire una stringa vuota.

risposta

8

Ops, penso di aver appena trovato la soluzione per questo problema. la CookieContainer è stato creato da server e deve essere mantenuta a client app. su btnSetName_Click, cambio

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

in

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

E funziona bene ora! Grazie a tutti voi.

+0

YESSSSSS !!!! Devo mantenere qualche codice legacy per un servizio web ASMX, e questo ha risolto il mio problema! Grazie! –

1

prova sotto

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); 
} 

Quando si chiama il metodo btnSetName_Click e btnWelcome_Click click ragnatele ervice Considerate la vostra reqwests come nuove sessioni.

+0

"Quando si chiama il metodo btnSetName_Click e btnWelcome_Click fare clic su Web ervice considera i reqwests come nuove sessioni." Sì, questo è il mio problema, voglio mantenere la sessione per tutte le attività dell'app client. Grazie per la risposta. – huynhtuanh