2011-11-01 24 views
6

Estoy utilizando una aplicación cliente para conectarme a un servicio web solo para usuarios autenticados. Aquí es ejemplo más sencillo:
Mi código de servicio web:Mantener la sesión al llamar a un servicio 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; 
    } 
} 

Aquí está mi código en la aplicación cliente (formulario de Windows, no base de la tela):

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

En mi ejemplo es una MainForm.m_ccSessionInfo miembro estático, quiero mantener el valor de las cookies de sesión en este!
Sin embargo, no funcionan :(. El ws.WelcomeMsg() siempre se devuelve una cadena vacía.

Respuesta

8

Vaya, creo que sólo he encontrado la solución para este problema. el CookieContainer es creado por el servidor y debe mantenerse a la aplicación cliente. en btnSetName_Click, cambio

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

en

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

y funciona bien ahora! Gracias a todos.

+0

YESSSSSS !!!! Tengo que mantener algún código heredado para un servicio web ASMX, ¡y esto solucionó mi problema! ¡Gracias! –

1

intento por debajo

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

Al llamar método btnSetName_Click y btnWelcome_Click ervicio clic telas consideran sus reqwests como nuevas sesiones.

+0

"Al llamar al método btnSetName_Click y btnWelcome_Click, haga clic en webs ervice considere sus peticiones como sesiones nuevas." Sí, ese es mi problema, quiero mantener la sesión para todas las actividades de la aplicación cliente. Gracias por la respuesta. – huynhtuanh

Cuestiones relacionadas