2011-01-21 20 views
70

¿Puedo usar valores de sesión dentro de un WebMethod?¿Cómo puedo acceder a la sesión en un webmethod?

He intentado usar System.Web.Services.WebMethod(EnableSession = true) pero no puedo acceder a los parámetros de sesión como in this example:

[System.Web.Services.WebMethod(EnableSession = true)] 
    [System.Web.Script.Services.ScriptMethod()] 
    public static String checaItem(String id) 
    { 
     return "zeta"; 
    } 

aquí es el que llama a la JS WebMethod:

$.ajax({ 
     type: "POST", 
     url: 'Catalogo.aspx/checaItem', 
     data: "{ id : 'teste' }", 
     contentType: 'application/json; charset=utf-8', 
     success: function (data) { 
      alert(data); 
     } 
    }); 
+4

Publicar un ejemplo de código nos ayudará a darle una respuesta. – volpav

+0

¿Estás recibiendo una excepción? –

+1

En el ejemplo anterior, no veo que intente acceder a ningún valor de sesión. Primero debe establecer la var de sesión y luego acceder a ella como el enlace que publicó. return (int) Session ["Conversiones"]; – capdragon

Respuesta

94

que puede utilizar:

HttpContext.Current.Session 

Pero será null a menos que también pecify EnableSession=true:

[System.Web.Services.WebMethod(EnableSession = true)] 
public static String checaItem(String id) 
{ 
    return "zeta"; 
} 
+17

Irónicamente, esto es lo que ya estaba haciendo, solo que no funcionaba para mí. HttpContext.Current.Session.Count devolvió 0 (es decir, no hay elementos en Session). Para mí, la respuesta estaba en la pregunta, cambiando [WebMethod] a [WebMethod (EnableSession = true)] funcionó. ¡Woot! – BrainSlugs83

+3

Recuerde configurar la web.config Moesio

10

Hay dos maneras de activar la sesión para un método Web:

1. [WebMethod(enableSession:true)] 

2. [WebMethod(EnableSession = true)] 

El primer argumento del constructor uno con enableSession:true no funciona para mí. El segundo con la propiedad EnableSession funciona.

+0

No puedo [averiguarlo] (https://msdn.microsoft.com/en-us/library/system.web.services.webmethodattribute%28v=vs.110%29. aspx) si el primero incluso compila, creo que no. El segundo funciona porque usted está configurando la propiedad (siendo obvio aquí XD). – MVCDS

+0

@MVCDS ¿Por qué crees que no se debe compilar? Puede encontrar un constructor público 'WebMethodAttribute (Boolean)' en documentos. – Warlock

+0

Tienes toda la razón. ¿Se comporta de manera diferente si no establece el nombre del parámetro? Porque si lo hace, sucedió algo muy extraño cuando estaban codificando constructores (para atributos). – MVCDS

0

Usted puede tratar como esto [WebMethod] pública MiMetodo static void (cadena ProductID, Precio cadena, cadena de Cantidad, cadena total) // Añadir nuevo parámetro Aquí { db_class CONNSTRING = new db_class(); tratar {

  DataTable dt = (DataTable)HttpContext.Current.Session["aaa"]; 

      if (dt == null) 
      { 
       DataTable dtable = new DataTable(); 

       dtable.Clear(); 
       dtable.Columns.Add("ProductID");// Add new parameter Here 
       dtable.Columns.Add("Price"); 
       dtable.Columns.Add("Quantity"); 
       dtable.Columns.Add("Total"); 
       object[] trow = { ProductID, Price, Quantity, Total };// Add new parameter Here 
       dtable.Rows.Add(trow); 
       HttpContext.Current.Session["aaa"] = dtable;     
      } 
      else 
      { 
       object[] trow = { ProductID, Price, Quantity, Total };// Add new parameter Here 
       dt.Rows.Add(trow); 
       HttpContext.Current.Session["aaa"] = dt; 
      } 


     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
0

Para permitir que la sesión que tenemos que utilizar [WebMethod (EnableSession: true)]

[WebMethod(EnableSession=true)] 
public string saveName(string name) 
{ 
    List<string> li; 
    if (Session["Name"] == null) 
    { 
     Session["Name"] = name; 
     return "Data saved successfully."; 

    } 

    else 
    { 
     Session["Name"] = Session["Name"] + "," + name; 
     return "Data saved successfully."; 
    } 


} 

Ahora retrive estos nombres usando sesión podemos ir así

[WebMethod(EnableSession = true)] 
    public List<string> Display() 
    { 
     List<string> li1 = new List<string>(); 
     if (Session["Name"] == null) 
     { 

      li1.Add("No record to display"); 
      return li1; 
     } 

     else 
     { 
      string[] names = Session["Name"].ToString().Split(','); 
      foreach(string s in names) 
      { 
       li1.Add(s); 
      } 

      return li1; 
     } 

    } 

por lo que se recupera todos los nombres de la sesión y muestra.

Cuestiones relacionadas