438 messaggi dal 08 aprile 2009
Sto progettando una nuova applicazione che girerà sia su dispositivi mobile che su web.
L'engine dell'applicazione è su classi i cui metodi verranno richiamati sia dai dispositivi che dall'applicazione web.
Sui dispositivi mobile i dati della compilazione di una determinata procedura (ad esempio righe ordini di acquisto) vengono salvate su liste strutturate (List<T>).
L'applicazione web verrà sviluppata con Visual Studio 2010 ed essendo nuova stavo guardando un pò in giro e ho visto che la cache è stata apliata permettendo il salvataggio dei dati anche su disco.
Salvando la compilazione e quindi le List su cache associando ad ogni nome di file la sessionid è una soluzione valida o sto percorrendo una strada completamente sbagliata?
Inoltre volevo implementare le richieste tramite servizi wcf richiamati da jquery per evitare il ricaricamento della pagina.
Mi sembra di aver capito che i servizi sono in grado di accedere alla cache o sbaglio?

Grazie
Laura
5.610 messaggi dal 09 febbraio 2002
Contributi
Ciao,
Sto progettando una nuova applicazione che girerà sia su dispositivi mobile che su web.

Hai già scelto che tecnologia utilizzare, se Asp.Net WebForms o MVC?

Salvando la compilazione e quindi le List su cache associando ad ogni nome di file la sessionid è una soluzione valida o sto percorrendo una strada completamente sbagliata?


Penso che tu intenda l'OutputCache, ma non devi decidere tu il nome del file (?) Con Asp.Net puoi inserire in cache un'intera pagina, una parte di essa o solo un oggetto, ma senza doverti preoccupare poi di dove effettivamente (se in memoria o sul disco) vengano persistite queste risorse.

Potresti per esempio crearti uno UserControl (se usi WebForms) o una ChildAction (se usi MVC3) che stampi in html la tua List<T>. Con la direttiva @OutputCache puoi istruire Asp.Net affinché inserisca in cache questa porzione di pagina. Puoi far variare la cache in base all'utente, in modo che l'uno non veda la lista dell'altro.
A tal proposito, leggi questo articolo di Cristian Civera.
http://www.aspitalia.com/script/606/Utilizzare-VaryByCustom-OutputCache-ASP.NET.aspx

In alternativa, potresti inserire in cache la List<T> anziché lo user control (leggi qui come usare l'oggetto Cache) ma così facendo dovresti comunque fare il databinding ad ogni richiesta, e l'output dovrebbe essere rigenerato sempre identico ogni volta.


Inoltre volevo implementare le richieste tramite servizi wcf richiamati da jquery per evitare il ricaricamento della pagina.


Se vuoi mantenere i tempi di caricamento al minimo, allora concentra i tuoi sforzi sull'OutputCache, è il modo migliore per aumentare la reattività del sito. Non abusarne, ovviamente. E' anche importante che gli utenti vedano nel sito dati aggiornati.
Fortunatamente la cache di pagina può scadere automaticamente se si verificano aggiornamenti nel db, o se un file o un'altra chiave di cache cambiano o vengono rimossi. Questo ti mette in condizione di far durare la Cache abbastanza a lungo, ma solo finché non vengono apportati aggiornamenti ai dati ed è quindi necessaria una rielaborazione.

Usa strumenti tipo YSlow o PageSpeed per avere consigli pratici su come migliorare i tempi di accesso al sito.

Io non farei troppe chiamate ajax perché è bene che ogni pagina del sito deve abbia un proprio url affinché venga indicizzata correttamente dai motori di ricerca. Userei jQuery e Ajax solo in punti strategici, ad esempio per controllare la validità di uno username o per aggiungere un prodotto alla lista dei desideri, o per inviare un commento. Insomma, per attività che se comportassero un ricaricamento di pagina distrarrebbero solo l'utente.

Inoltre, anziché un servizio WCF valuta i PageMethods. Sono metodi statici di una pagina aspx che puoi consumare da ajax. E' più pratico così, secondo me, piuttosto che stare a configurare un servizio WCF.
http://www.aspitalia.com/articoli/asp.net/jquery-ajax-p-2.aspx#title_2


Mi sembra di aver capito che i servizi sono in grado di accedere alla cache o sbaglio?


Certo, ci arrivi da System.Web.HttpRuntime.Cache.

ciao,
Modificato da BrightSoul il 28 luglio 2011 23.19 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
438 messaggi dal 08 aprile 2009
Cerco di andare per ordine:

BrightSoul ha scritto:
Ciao,
Hai già scelto che tecnologia utilizzare, se Asp.Net WebForms o MVC?


Si preferisco Asp.Net WebForms anche se è tutto in fase embrionale e di studio, ma da quello che ho letto per applicativi (è un gestionale su web di raccolta ordini per agenti di vendita) MVC è limitativo quindi credo che WebForms sia uno dei miei punti fermi.


Penso che tu intenda l'OutputCache, ma non devi decidere tu il nome del file (?) Con Asp.Net puoi inserire in cache un'intera pagina, una parte di essa o solo un oggetto, ma senza doverti preoccupare poi di dove effettivamente (se in memoria o sul disco) vengano persistite queste risorse.



Quindi creare un provider personalizzato è uno spreco di risorse al momento. Il mio problema attualmento non è mandare in cache l'intera pagina ma singoli oggetti di tipo List<> diversificati per utente. Ad esempio per la maschera compilazione dell'ordine: l'utente inserisce man mano le righe degli articoli; questi volevo salvarli man mano nella cache in modo tale che se cade la sessione o volutamente l'utente esce dall'applicativo, al prossimo accesso l'ordine non completato è in cache e quindi può essere ricaricato.


Potresti per esempio crearti uno UserControl (se usi WebForms) o una ChildAction (se usi MVC3) che stampi in html la tua List<T>. Con la direttiva @OutputCache puoi istruire Asp.Net affinché inserisca in cache questa porzione di pagina. Puoi far variare la cache in base all'utente, in modo che l'uno non veda la lista dell'altro.


A tal proposito, leggi questo articolo di Cristian Civera.
http://www.aspitalia.com/script/606/Utilizzare-VaryByCustom-OutputCache-ASP.NET.aspx



Perfetto è proprio quello che mi serviva.


In alternativa, potresti inserire in cache la List<T> anziché lo user control (leggi qui come usare l'oggetto Cache) ma così facendo dovresti comunque fare il databinding ad ogni richiesta, e l'output dovrebbe essere rigenerato sempre identico ogni volta.

Se vuoi mantenere i tempi di caricamento al minimo, allora concentra i tuoi sforzi sull'OutputCache, è il modo migliore per aumentare la reattività del sito. Non abusarne, ovviamente. E' anche importante che gli utenti vedano nel sito dati aggiornati.
Fortunatamente la cache di pagina può scadere automaticamente se si verificano aggiornamenti nel db, o se un file o un'altra chiave di cache cambiano o vengono rimossi. Questo ti mette in condizione di far durare la Cache abbastanza a lungo, ma solo finché non vengono apportati aggiornamenti ai dati ed è quindi necessaria una rielaborazione.


Per gli scopi che ti ho descritto non credo di abusare della cache.



Usa strumenti tipo YSlow o PageSpeed per avere consigli pratici su come migliorare i tempi di accesso al sito.

Io non farei troppe chiamate ajax perché è bene che ogni pagina del sito deve abbia un proprio url affinché venga indicizzata correttamente dai motori di ricerca. Userei jQuery e Ajax solo in punti strategici, ad esempio per controllare la validità di uno username o per aggiungere un prodotto alla lista dei desideri, o per inviare un commento. Insomma, per attività che se comportassero un ricaricamento di pagina distrarrebbero solo l'utente.

Inoltre, anziché un servizio WCF valuta i PageMethods. Sono metodi statici di una pagina aspx che puoi consumare da ajax. E' più pratico così, secondo me, piuttosto che stare a configurare un servizio WCF.
http://www.aspitalia.com/articoli/asp.net/jquery-ajax-p-2.aspx#title_2


Lo scopo è di creare un'applicazione semplice, intuitiva e veloce quindi devo eliminare tutti i ricaricamenti della pagina dove non necessari. Per questo parlo di jquery / ajax proprio i quei punti della maschera il cui ricaricamento da fastidio all'utente.

Fino ad adesso ho sempre utilizzato i PageMethods ed ineffetti sono molto più pratici. Il fatto è che tali chiamate potrebbero essere utilizzate anche da i dispositivi mobile e quindi centralizzare il tutto a livello organizzativo sarebbe meglio.

Per quanto riguarda l'indicizzazione non è un problema visto che si tratta di un applicativo semmai il sito pubblicitario dopo dovrà essere creato a regola d'arte proprio per indicizzarlo il più possibile su scala nazionale.

In definitiva grazie mille della risposta, mi hai tolto molti dubbi, e adesso studio e faccio un pò di prove :)
5.610 messaggi dal 09 febbraio 2002
Contributi
Ad esempio per la maschera compilazione dell'ordine: l'utente inserisce man mano le righe degli articoli; questi volevo salvarli man mano

Per quanto riguarda l'indicizzazione non è un problema visto che si tratta di un applicativo


ok, ora ho capito il caso d'uso, fai bene a voler utilizzare ajax dove possibile.
Tuttavia penso che la Cache abbia uno scopo leggermente diverso, che è quello di inserirci dati in maniera transitoria all'unico fine di migliorare le prestazioni della pagina. Le righe d'ordine le memorizzerei nel database che ti dà più sicurezza sul fatto che vengano persistite a lungo.
Io non conosco in manierà così approfondita la modalità di persistenza su file degli oggetti inseriti in Cache, quindi tendo a non dare per scontato che "sopravvivranno" anche ad un riavvio del server o fino alla prossima riconnessione dell'utente. Usare un database mi fa stare più tranquillo.


Fino ad adesso ho sempre utilizzato i PageMethods ed ineffetti sono molto più pratici. Il fatto è che tali chiamate potrebbero essere utilizzate anche da i dispositivi mobile e quindi centralizzare il tutto a livello organizzativo sarebbe meglio.

ok, come sviluppi la parte mobile? E' anch'essa un'applicazione web oppure un qualcosa che installi sul dispositivo tramite marketplace/appstore?

ciao,

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
438 messaggi dal 08 aprile 2009
La parte mobile sarà inizialmente una app che verrà installata sul dispositivo (la prima versione uscirà per Android) ed è sviluppata con Mono.

Successivamente la parte web verrà ridisegnata anche per dispositivi con una grafica ad-hoc, ma questo sarà il passaggio finale.

Il motivo di salvare gli oggetti su cache è perchè mi sembra la via più immediata, in quanto il codice delle classi che salvano man mano la compilazione degli ordini (in List<>) per dispositivi è già stata fatta. Quindi volevo riutilizzare tutta quella parte aggiungendo semplicemente il salvataggio dell'oggetto nella cache o oggetti similari...però visto che ancora non ho sviluppato niente sono disponibile a tutti i suggerimenti :). Qui chi sviluppa su web sono solo io e quindi non ho nessun tipo di confronto...e in questo progetto mi gioco molto, nel senso che sarò io ha decidere la strada da percorrere con tutti i rischi se sbaglio!!!
5.610 messaggi dal 09 febbraio 2002
Contributi

è sviluppata con Mono

ah, interessante, non l'ho mai usato su mobile. Si riesce a riciclare il codice dell'interfaccia utente nel momento in cui vuoi portare l'applicazione da Android ad iPhone? O l'ambiente è completamente differente?

Qui chi sviluppa su web sono solo io e quindi non ho nessun tipo di confronto...e in questo progetto mi gioco molto, nel senso che sarò io ha decidere la strada da percorrere con tutti i rischi se sbaglio!!!


Eh, lavorare da soli comporta una bella responsabilità :) ma non per forza deve restare tutto sulle tue spalle. Se coinvolgi gli altri e li metti in condizione di partecipare alle scelte, il rischio di sentirti dire "non è quello che volevamo" sarà sicuramente minore. Puoi fornire sin da subito una documentazione (che non necessariamente deve contenere dettagli tecnici) in cui spieghi quali sono le tue possibilità e quali vantaggi e svantaggi ognuna presenta. Se gli altri sono ben informati su cosa si sta realizzando, innanzitutto comprenderanno la necessità di determinati tempi di sviluppo e potranno anche apprezzare meglio la qualità del tuo lavoro.
E se dedichi sufficiente tempo alla pianificazione del lavoro, ti troverai a gestire meno imprevisti. Fai una checklist dei problemi che devi affrontare, anche a livello comunicativo, e poi cerca in rete spunti e tecnologie che ti aiutino a risolvere ciascuno di essi.

* Il committente ha espresso i maniera completa e dettagliata i suoi requisiti? Tu li hai ben compresi e documentati con diagrammi di casi d'uso e prototipi di interfaccia?
* Hai preparato una lista di funzionalità e stabilito un ordine di priorità di consegna? Ogni quanti giorni prevedi di sottoporre le nuove implementazioni al vaglio del committente, in modo che si possano risolvere tempestivamente eventuali problemi?
* Hai previsto lo unit testing durante lo sviluppo del progetto, in modo da eliminare molti bug sul nascere?
* Quali framework potresti usare per aumentare la tua produttività? Ad esempio, prevedi di usare un ORM che ti gestisca l'accesso ai dati?
* ...e così via

Se pianifichi accuratamente il lavoro avrai più coscienza dei tuoi mezzi e, per esempio, sarà più difficile "cedere" dalla facilità d'uso dell'oggetto Cache e più facile scegliere una soluzione più affidabile che magari prima sembrava più complessa da attuarsi.


visto che ancora non ho sviluppato niente sono disponibile a tutti i suggerimenti :)

Bene, allora è il momento giusto per fare ricerca! Il tempo che investi in ricerca ti permette di procedere poi molto più speditamente, rispetto a che se ti accontentarsi della prima soluzione trovata.

Buon lavoro!
Modificato da BrightSoul il 02 agosto 2011 00.25 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
438 messaggi dal 08 aprile 2009
Per quanto riguarda la realtà del prodotto siamo esperti in quanto il programma di tentata vendità già esiste e venduto in quantità.
Il programma gira su windows ce ed è stato adattato per andare anche su tablet.
Adesso l'esigenza è diversa ed è comunque di portare l'interfaccia su Android e iPad.
Con Mono puoi tranquillamente riutilizzare il codice che è nelle classi, quindi se tutto l'engine è centralizzato quello che devi solo ridisegnare dal punto di vista grafico.

Poichè l'engine è già stato riscritto l'obbiettivo principale è mantenere tutto centralizzato e riutilizzabile anche per un discorso di mantenimento: se troviamo un bug è molto più semplice e meno dispendioso andarlo a sistemare in un solo punto piuttosto che in tanti applicativi che fanno più o meno la stessa cosa.

Sicuramente i miei colleghi ne sono al corrente delle scelte e degli studi che sto facendo ma non c'è una culturo e un'esperienza tale da suggerirmi una strada piuttosto che un'altra. Negli ultimi anni questo forum mi ha aiutata molto :)

Quindi tu dici che salvare i dati compilati in un data base piuttosto che in cache sia la soluzione ottimale. Certo è che se un utente che compila un ordine si sposta di postazione avrebbe ancora la compilazione attiva e recuperabile.
Quello che mi preoccupa è l'eventuale gestione di compilazione di ordini che non vengono completati ad esempio...
5.610 messaggi dal 09 febbraio 2002
Contributi

Certo è che se un utente che compila un ordine si sposta di postazione avrebbe ancora la compilazione attiva e recuperabile.

Sì, e l'avrebbe anche se tu salvassi la lista nell'oggetto Cache, infatti i dati della cache vengono conservati lato server. Usando l'ID dell'utente come (parte della) chiave, potresti ritirar fuori la lista anche se dovesse ricollegarsi da un altro pc.

Ma il punto è sempre quello: se la garanzia che vuoi che l'utente possa continuare gli ordini lasciati a metà, alora devi necessariamente usare un sistema che ti garantisca la persistenza del dato. Ti ho consigliato il database, ma se tu preferisci i file di testo puoi pur sempre serializzare la tua List<T> su file xml (ammesso che la tua classe contenga tipi di dati serializzabili).


Quello che mi preoccupa è l'eventuale gestione di compilazione di ordini che non vengono completati ad esempio...

Per evitare che gli ordini lasciati a metà interferiscano con quelli completati, li puoi isolare memorizzandoli in un'altra tabella, oppure come detto poc'anzi, li puoi persistere in un modo completamente diverso, come la serializzazione.

Poi, affinché tutto resti pulito, mostra all'utente ben in evidenza un tasto che gli consenta di eliminare o di recuperare gli ordini che ha lasciato a metà (ammesso che possa lasciarne incompleti più d'uno).
Se vuoi "sollecitare" il completamento degli ordini incompleti, puoi far apparire un avviso dopo un certo numero di giorni o settimane che avvisi l'utente che quell'ordine verrà rimosso entro poco tempo se non viene completato al più presto.


Con Mono puoi tranquillamente riutilizzare il codice che è nelle classi, quindi se tutto l'engine è centralizzato quello che devi solo ridisegnare dal punto di vista grafico.

Da provare, peccato per il costo della licenza :/

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
    In primo piano

    I più letti di oggi

    Media
    In evidenza
    MISC