Problemi con l'oggetto Session

martedì 30 gennaio 2007 - 11.06

Carlo_ Profilo | Newbie

Salve ragazzi, sto utilizzando un oggettino per la gestione dello scanner inglobato in una pagina web.. da questo oggetto devo poi richiamare un altra pagina che fa sempre parte del sito ma facendo questo mi crea un'altra sessione e perdo quella precedente e di conseguenza perdo le variabili in essa.. Qualcuno mi sa dare una soluzione per non perdere i dati? Grazie

trasportation Profilo | Junior Member

Non si utilizzano le Sessioni, sono abolite .

Le Sessioni sono un'invenzione per facilitare il lavoro ma dal punto di vista performante lato server sono un disastro (anche se .Net ha migliorato la gestione delle memoria).

Il mio consiglio è quello di utilizzare il passaggio delle informazioni tra le pagine tramite post o get oppure puoi utilizzare l'oggetto Cache (questo oggetto però ragiona per applicazione non per sessione utente quindi i dati sono visibili da tutte le sessioni utente connesse al server) dipende dal tipo di informazioni che vuoi passare.

R.
/*
* web: http://www.robertobeccari.it
*/

Carlo_ Profilo | Newbie

Scusa ma sono un neofita sia del .net che del web in generale.
Ad ogni modo io ho questo controllo che importo nella mia pagina in questo modo.

<object id="Scan" classid="..oggetto " style="width: 100%; height: 60%"></object>

questo oggetto esegue una serie di cose e alla fine mi salva un file in locale.
Al momento del click di un bottone di questo oggetto io mi recupero il file da locale e lo rimando ad un'altra pagina asp con un metodo di una classe dell'oggetto in questione dovendogli passare come parametro propio l'url della pagina.
Questa però dovrebbe tenersi memoria anche di un altra variabile di identificazione dell'utente logato perchè quest'ultima mi serve per le abilitazioni di alcune funzioni della pagina. Ora non credo di poter utilizzare l'oggetto Cache perchè appunto dovrei tener traccia solo all'interno della sessione utente della cosa. Immagino che dovrei riuscire a passare l'identificazione dell'utente all'oggettino e poi successivamente passarlo come parametro alla pagina che richiamo. Ma non so come eseguire il primo passaggio..

trasportation Profilo | Junior Member

Mi fai un esempio della chiamata che fai?
/*
* web: http://www.robertobeccari.it
*/

Carlo_ Profilo | Newbie

certo..l'oggetto in questione è della atalasoft.. nella pagina web lo richiamo

<object id="Scan" classid="../TwainControl.dll#TwainControl.Twain" style="width: 100%; height: 60%"></object>

..quindi questo è il metodo dell'oggetto richiamato

public Twain()
{
InitializeComponent();
this.acquisition1.FileTransfer += new FileTransferEventHandler(acquisition1_FileTransfer);
......
}

..poi dall'evento del bottone salva eseguo il seguente codice..

private void btnSalva_Click(object sender, EventArgs e)
{
FileStream fs = new FileStream(percorso file tiff, FileMode.Open, FileAccess.Read);
Atalasoft.Twain.HttpPost post = new Atalasoft.Twain.HttpPost(System.Drawing.Imaging.ImageFormat.Tiff);

post.FormData.Add("image1", fs,nomeFileTiff, null);
string retVal = post.PostData(""http://localhost...");

}

..questo di seguito è invece il codice della pagina che riceve..

protected void Page_Load(object sender, EventArgs e)
{

if (Request.Files.Count != 0)
{
fileName = System.IO.Path.GetFileName(Request.Files[0].FileName);
...
...
}
}

..come si vede da qui mi passo un filestream e me lo recupero..ma oltre a questo come detto dovrei tenermi traccia dell'utente.. eventualmente FormData è una collection e potrei inserirlo li ma il problema ritengo sia passarlo all'oggetto Twain

trasportation Profilo | Junior Member

Mi aspettavo una cosa del genere, l'oggetto esegue un post ad un pagina (dipende probabilmente da quello il fatto che perdi la sessione) e questo genera una nuova chiamata al server (generando una nuova sessione).

Sì, devi inserire l'id del tuo utente come dato da postare alla tua pagina, potresti fare una cosa del genere

post.FormData.Add("userId", myId);

e nella pagina di destinazione

Request.Forms["userId"];

In questo modo dovresti ritrovarti il tutto.

/*
* web: http://www.robertobeccari.it
*/

trasportation Profilo | Junior Member


>Molto utile è anche passare i valori tramite context.items o
>tramite le proprietà della pagina
>http://www.dotnethell.it/tips/ServerTransferASPNET.aspx

Credo che il problema per lui rimanga, dal momento che l'oggetto che utilizza genera una nuova chiamata al server perdendo quindi il contesto corrente perchè non è lui a eseguire la chiamata ma l'oggetto che ha instanziato.

Non sò, non conosco l'oggetto che utilizza e non posso provare l'applicazione, magari sbaglio.

R.


/*
* web: http://www.robertobeccari.it
*/

Carlo_ Profilo | Newbie

>Mi aspettavo una cosa del genere, l'oggetto esegue un post ad
>un pagina (dipende probabilmente da quello il fatto che perdi
>la sessione) e questo genera una nuova chiamata al server (generando
>una nuova sessione).
>
>Sì, devi inserire l'id del tuo utente come dato da postare alla
>tua pagina, potresti fare una cosa del genere
>
>post.FormData.Add("userId", myId);
>
>e nella pagina di destinazione
>
>Request.Forms["userId"];
>
>In questo modo dovresti ritrovarti il tutto.
>
>/*
> * web: http://www.robertobeccari.it
> */
>

ok con il formatdata passo l'idUtente dall'oggetto alla pagina verso la quale faccio il post ma come faccio a passare il myId all'oggetto in questione dalla pagina web nel quale risiede..partendo dal fatto che ho questo valore nell'oggetto Session della pagina.. non vogliatemene ma sto mantenendo un progetto gia fatto.. sapendo che richiamo l'oggetto con il codice html che leggete qualche post più su..

trasportation Profilo | Junior Member

Scusa ma non capisco il problema abbi pazienza.

Il valore che si trova nella variabile di sessione lo metti tra i dati da postare all'altra pagina.

post.FormData.Add("userId", Session["NomeVariabile"]);

che cosa c'è dentro la variabile di sessione che non puoi passare in post all'altra pagina??

Forse mi sfugge qualcosa...

R.
/*
* web: http://www.robertobeccari.it
*/

Carlo_ Profilo | Newbie

forse dico una stupidaggine ma penso che l'oggetto Session sia relativo solo alle pagine web per cui non ce l'ho nel codice del controllo Twain..o mi sbaglio?!..

trasportation Profilo | Junior Member

Questa domanda mi fà pensare che tu non sappia bene come funzioni una pagina ASP.net .

La Sessione, non appartiene a nessuno (nel senso che viene creata alla tua prima richiesta di una pagina al server, poi .net provvede a portarsela dietro per ogni pagina), te lo ritrovi come oggetto della pagina solo per comodità, in un certo senso sono le pagine che appartengono all'oggetto sessione non il contrario è un'oggetto trasversale a tutte le pagine del tuo sito, è per questo che te la perdi quando utilizzi l'oggetto per il post dei dati ad un'altra pagina perchè viene generata una nuova sessione.

Ma tornando al discorso precedente perchè non metti le informazioni della sessione nella collection del post e lo riprendi nella pagina di destinazione??.

R.

/*
* web: http://www.robertobeccari.it
*/

Carlo_ Profilo | Newbie

Infatti hai ragione..è da poco che che lavoro in questo ambiente e ti ringrazio per le informazioni e la pazienza..

comunque il fatto è che io ho anche provato a scrivere sull'evento del controllo la seguente riga..

post.FormData.Add("UserId", HttpContext.Current.Session["UserId"].ToString())


..ma mi crea un'eccezione del tipo

System.NullReferenceException: Riferimento a un oggetto non impostato su un'istanza di oggetto..
..naturalmente ho testato e nella pagina web che contiene il controllo l'istruzione
HttpContext.Current.Session["UserId"].ToString() mi ritorna il valore..mentre nel controllo no..

..forse devo abbandonare questa ipotesi..

trasportation Profilo | Junior Member

L'errore è dovuto al fatto che nel momento della richiesta non esiste nessuna variabile di sessione con quel nome.

Quando metti le informazioni dell'utente connesso all'interno della variabile di Sessione???

devi sempre verificare che la variabile esista, (Session["UserId"]!=null).

No, non devi abbandonare questa strada, perchè come idea è corretta, devi capire il perchè hai il problema.

Purtroppo senza il codice non ti posso aiutare, hai provato a lanciare l'applicazione sotto debug?

R.


/*
* web: http://www.robertobeccari.it
*/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5