2009-12-08 4 views
1

Je rencontre un problème avec les variables de session ASP.NET et un objet proxy de service Web. Je peux accéder à toutes les données que je crée dans le fichier .asmx réel, mais l'ajout de données "Through" à la variable de session aboutit à ce qu'il ne se passe absolument rien.Variables de session, services Web, ASP.NET et C#

Mon objectif est assez simple, je veux créer un "Panier presque Shopping". Le client entre un titre dans cette zone de texte et il est envoyé au service Web. Le service Web est appelé dans la page maître et saisit une liste de tableaux remplie des "titres" demandés par le client.

Les données sont visibles dans une liste déroulante, et une étiquette qui stocke le coût total de tous les articles (je ne suis pas inquiet du coût pour le moment).

Le problème est, chaque fois que j'appelle une méthode de service Web, absolument rien ne se passe.

Le code en question:

Basket.asmx

public class basket : System.Web.Services.WebService { 

ArrayList reservations = new ArrayList(); 
double total = 0; 

public basket() 
{ 
    reservations.Add("Extreme Test Data"); 
    reservations.Add("Moar Test Data"); 
} 

[WebMethod] 
public string[] getReservations() 
{ 
    //This may be part of the issue, still not sure. 

    return (string[])reservations.ToArray(typeof(string)); 
} 
[WebMethod] 
public string toString() 
{ 
    return reservations[reservations.Count - 1].ToString(); 
} 


[WebMethod] 
public double getTotal() 
{ 
    return total; 
} 

[WebMethod] 
public void addCost(double price) 
{ 
    total = total + price; 
} 

[WebMethod] 

public void addReservation(String title) 
{ 

    reservations.Add(title); 

} 
[WebMethod] 
public void removeReservation(string title) 
{ 
} 
[WebMethod] 
public int getLength() 
{ 
    return reservations.Count; 
} 

Global.asax

void Session_Start(object sender, EventArgs e) 
{ 
    // Code that runs when a new session is started 
    localhost.basket proxy = new localhost.basket(); 
    Session["reservations"] = proxy; 
} 

(Tout le reste est global.asax par défaut)

Masterpage

Ceci est le seul code pertinent dans la page maître. Il appelle le service Web via la variable de session.

protected void Page_Load(object sender, EventArgs e) 
{ 

    localhost.basket proxy = (localhost.basket)Session["reservations"]; 

     lblTotal.Text = proxy.getTotal().ToString("c"); 
     string[] res = proxy.getReservations(); 
     ddReservations.DataSource = res; 
     ddReservations.DataBind(); 
     proxy.addReservation("Half Life 2"); 
} 

Reservations.aspx

Cette page présente les réels "nouvelles" données au service Web. J'ai coupé beaucoup de ceci (c'est un projet de groupe, donc il y a beaucoup de code que je n'ai pas écrit). Qu'est-ce qui fonctionne: Les valeurs de test par défaut I entrées dans l'ASMX, ils se chargent très bien dans la zone de texte.

Donc, en résumé, puis-je utiliser un objet proxy de service Web dans une variable de session? Si non, quelle est la meilleure façon de "partager" cet objet?

Aussi: J'utilise VS2005.

Merci pour toute aide!

Répondre

5

Chaque appel de service Web se produit sur une instance différente de la classe de service Web. Votre variable reservations ne peut pas être utilisée pour maintenir l'état entre les appels, puisqu'il s'agit d'une variable d'instance.

Vous feriez mieux de rendre votre service apatride. Cependant, pour un cas comme celui-ci, vous devez stocker le panier dans une base de données. De cette façon, le panier ne sera pas perdu en cas de défaillance du système.

+0

D'accord. Un bon design peut remédier à ces problèmes. –

+0

Très bien, merci, nous l'avons déjà implémenté via une base de données, donc ce ne sera pas si difficile à mettre en œuvre, merci! – Alpaca