in

dotNet Umbria

Il primo User Group in Umbria sul mondo .Net
Latest post 01-29-2008 2:22 PM by Paolo Possanzini. 34 replies.
Page 1 of 3 (35 items) 1 2 3 Next >
Sort Posts: Previous Next
  • 12-06-2007 12:36 PM

    Info Varie

    Innanzi tutto mi scuso se non scrivo nella sezione giusta.

    L'altro giorno ho parlato con il prof di informatica per via della tesi a riguardo proprio di pocket pc. Mi ha detto dell'evento avvenuto il giorno 30 novembre ed ahime' al quale non ho potuto partecipare.

    Sono particolarmente interessato a quello che si è potuto dire quel giorno e per questo volevo chiedervi del materiale tipo slide da poter guardare.

    Sempre con il prof ho iniziato una discussione che riguarda la comunicazione del palmare (con windows mobile 5.0)  con il server e mi diceva che avete trattato anche quello.

    Ora facendo il tirocinio all'interno di un azienda sento la necessita' di far comunicare il mio pocket pc cn un server e si era pensato ad una webservices, il che xò e' unidirezionale, mentre noi avremo bisogno di qualcosa di tipo bidirezionale.

    Sapete indicarmi qualcosa a riguardo?

    Mi complimento con voi per l'iniziativa  e vi ringrazio anticipatamente. 

  • 12-06-2007 2:10 PM In reply to

    Re: Info Varie

    Ciao,

    al più presto metterò su le slides dell'evento e soprattutto il codice che ho fatto per l'applicazione Mobile.

    Riguardo al mobile volevo fare una considerazione con te a proposito. Immagino che per "unidirezionale" tu intenda il fatto che è il palmare a fare la connessione al server, questo pero' non inficia il fatto che il server restituisca delle informazioni, anzi.. è proprio per quello che tipicamente si interroga un servizio.Tecnologicamente nulla vieta che tu possa fare un servizio che si connette con un socket tcp/ip al server aprendo un canale bidirezionale, qui trovi un esempio trovato al volo sull'argomento:

    http://www.codeproject.com/KB/mobile/pocketremote.aspx

     Vorrei però darti un consiglio di tipo architetturale. tipicamente il palmare lavora in un ambiente connesso/disconnesso, questo significa che l dispositivo mobile puo' avere un funzionamento disconnesso (raccolta dati, elaborazione parziale di questi) in alcuni momenti della sua vita, mentre momenti connessi (sync dati, download tabelle di sistema, richiesta di elaborazioni "pesanti" al server per poter disporre al termine dei risultati,...) .

    Questo inficia molte volte l'utilizzo dell'applicativo se questo richiede una canale aperto e non puo' lavorare con le condizioni di rete, tipicamente precarie (rete wi fi che va' e viene o anche rete gprs/umts), che sono presenti realmente,

    Molto più efficiente sarebbe allora permettere al dispositivo di colloquiare con il server su richiesta (o su pianificazione temporale: timers o threads che partono ogni tot secondi) durante i quali l'applicativo potrà inviare dati e richiedere aggiornamenti dei propri.

    Spero di averti dato degli spunti di riflessione, ti consiglio di iniziare a dare un'occhiata alle nuove librerie wcf per il .Net Compact Framework 3.5. Se vuoi approfondire la questione possiamo sentirci oppure fissare un caffe Smile

     

    Ciao,

     

    Andrea Cruciani

    Andrea Cruciani

    Filed under:
  • 12-06-2007 3:00 PM In reply to

    Re: Info Varie

    In effetti stavamo pensando proprio a far colloquiare il client al server ad intervalli di tempo. Ma magari ce la necessita' di inviare da parte del server delle info in tempo reale..Allora pensavamo anche ad una soluzione ibrida...Lasciare in ascolto il palmare cn un socket e inviare i dati ad un server cn webservice. (oppure ridurre gli intervalli di tempo).

    O soluzione alternativa usare una vpn e poi magari leggere e scrivere info su un database in remoto, ma nn so se e' una scelta sensata e giusta.

    Tra l'altro sto sviluppando con il compact framework 2.0, e ancora non do nemmeno un occhiata al nuovo 3.5.

     

    Spero in un vostro consiglio

      

  • 12-06-2007 3:51 PM In reply to

    Re: Info Varie

    Puoi fare anche una soluzione ibrida ma devi fare una stima di quanto questo approccio sia vitale. E? tollerabile aspettare un minuto o due prima di avere l'informazione? Se si utilizzerei una soluzione unica, putnando a fare una buona architettura con quella invece che complicare la situazione con un approccio misto (complicato != da buon software). Io terrei la soluzione socket solo per casi simili a quelli che ti ho postato nel lla prima risposta.

    Riguardo al CF 3.5 credo sia interessante l'pproccio dei servizi proposto da WCF, che ora è in grande espansione.

    Troverai qualche esempio nel codice che abbiamo fatto vedere all'evento e che spero di pubblicare al piu' presto.

    Andrea Cruciani

  • 12-06-2007 4:03 PM In reply to

    Re: Info Varie

     Attendo con impazienza questo codice pubblicato.

    Intanto stavo dando un occhiata su come funzionasse le push email e al massimo usare una soluzione del genere in caso il server ha necessita' di comunicare in tempo reale. Ovviamente si dovrebbe trovare anche un server push che non costasse troppo.

  • 12-07-2007 9:51 AM In reply to

    Re: Info Varie

    Volevo chiedere, qual'è il modo migliotr per creare una dll separata per poi poter richiamare un web services..Anche perche' il webservices wsdl dal lato server e' realizzato in java..Io per provare al momento ho aggiunto la webrefernce nel progetto con visual studio.

    Per il desktop uso wsdl.exe mi genera il file .cs che poi compilo...Ma se poi la dll la vado ad utilizzare sul pocket non funziona.

    Grazie in anticipo

  • 12-07-2007 10:20 AM In reply to

    Re: Info Varie

    Le Dll che generi per il framework 2.0 poi non funzionano sul compact framework perchè è molto più limitato.
    Le dll desktop hanno dei riferimenti ad alcuni assembly che sul PPC non ci sono.

    E' vero però il contrario, in virtù dell'attributo [assembly: AssemblyFlags(AssemblyNameFlags.Retargetable | AssemblyNameFlags.PublicKey)] inserito all'interno degli assembly del compact framework, puoi far girare le Dll che crei per il CompactFramework su un PC desktop senza grossi problemi. Ovvero il CLR si accorge che per ogni Dll referenziata ne esiste una più completa e quindi referenzia a runtime la dll del framework 2.0 anche se hai una reference ad una dll del CF

    Ciò non toglie che il modo migliore per agganciare un WebService dai due mondi è creare due assembly, uno per il mondo Desktop ed uno per il mondo mobile. Nessuno ti vieta di utilizzare una dll generata per il CF in un progetto desktop, ma avrai a disposizione molte meno funzionalità, perchè quando la progetti, devi farlo pensando di farla girare nel CF.

    Spero di esserti stato di aiuto

    Ciao

    Paolo

    Filed under: ,
  • 12-07-2007 10:44 AM In reply to

    Re: Info Varie

     Ho capito...Il problema xò e' che non so generare la dll per il compact...Sad, inoltre mi servirebbe sapere se è meglio usare una dll esterna o una reference all'interno del progetto.

     

    Ancora Grazie 

  • 12-07-2007 11:24 AM In reply to

    Re: Info Varie

    Devi aggiungere alla tua soluzione un progetto di tipo classlibrary con il tamplate di un progetto mobile.
    Se non lo trovi significa che non hai installato l'SDK per il Compact Framework.
     Lo trovi qui: link

    Per la scelta se utilizzare una dll esterna, dipende. Se la vuoi riutilizzare oppure no. Se la vuoi utilizzare per altre applicazioni oppure se la tua applicazione è abbastanza complessa e composta da molti progetti allora è meglio fare una dll esterna. Se invece la tua applicazione è un unico progetto e non intendi riutilizzare quello che metti dentro la dll allora puoi fare una reference diretta.

    Ciao

  • 12-07-2007 11:38 AM In reply to

    Re: Info Varie

    ok ma questo e' come aggiungerla.....

    Ma come la genero? se la genero con wsdl.exe non funziona. 

  • 12-07-2007 12:28 PM In reply to

    Re: Info Varie

    Scusa, non avevo capito qual'era la difficoltà.
    Puoi provare a fare il tutto attraverso VisualStudio.
    Crei il progetto mobile e poi da li fai Add Web Reference  (la soluzione che preferisco Wink), ed ottieni codice per Mobile,
    oppure puoi generare la classe con WSDL.exe e seguire le istruzioni in questo link per renderla compatibile con il CF:
    http://msdn2.microsoft.com/en-us/library/ms229663.aspx

    So che ci sono anche dei PowerToys per Compact Framework che fanno il lavoro che farebbe WSDL. Ma quelli che ho trovato sono in Beta e per il CF v3.5 e non so se generano codice anche per CF v2.0:
    http://www.microsoft.com/downloads/details.aspx?FamilyID=C8174C14-A27D-4148-BF01-86C2E0953EAB&displaylang=en

     

    Ciao

  • 12-14-2007 12:04 PM In reply to

    Re: Info Varie

    Ragazzi io nn ci sono riuscito a crearmi la dll per il compact...Semmai posso postare la classe in modo da potermela corregere voi?

     

    Grazie mille Piero 

  • 12-14-2007 12:11 PM In reply to

    Re: Info Varie

    Posta tranquillamente la classe. Felicissimi di darti una mano.

    Ciao

  • 12-14-2007 12:16 PM In reply to

    Re: Info Varie

    //------------------------------------------------------------------------------
    // <auto-generated>
    //     Il codice è stato generato da uno strumento.
    //     Versione runtime:2.0.50727.832
    //
    //     Le modifiche apportate a questo file possono provocare un comportamento non corretto e andranno perse se
    //     il codice viene rigenerato.
    // </auto-generated>
    //------------------------------------------------------------------------------

    using System;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Web.Services;
    using System.Web.Services.Protocols;
    using System.Xml.Serialization;

    //
    // Codice sorgente generato automaticamente da wsdl, versione=2.0.50727.42.
    //


    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Web.Services.WebServiceBindingAttribute(Name="pieroTestHttpBinding", Namespace="http://DefaultNamespace")]
    public partial class pieroTest : System.Web.Services.Protocols.SoapHttpClientProtocol {
       
        private System.Threading.SendOrPostCallback provaOperationCompleted;
       
        /// <remarks/>
        public pieroTest() {
            this.Url = "http://carpoolsrv:8080/tryalWS/services/pieroTest";
        }
       
        /// <remarks/>
        public event provaCompletedEventHandler provaCompleted;
       
        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", RequestNamespace="http://DefaultNamespace", ResponseNamespace="http://DefaultNamespace", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        [return: System.Xml.Serialization.XmlElementAttribute("out", IsNullable=true)]
        public System.Nullable<int> prova([System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] System.Nullable<int> in0, [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] System.Nullable<int> in1) {
            object[ results = this.Invoke("prova", new object[ {
                        in0,
                        in1});
            return ((System.Nullable<int>)(results[0]));
        }
       
        /// <remarks/>
        public System.IAsyncResult Beginprova(System.Nullable<int> in0, System.Nullable<int> in1, System.AsyncCallback callback, object asyncState) {
            return this.BeginInvoke("prova", new object[ {
                        in0,
                        in1}, callback, asyncState);
        }
       
        /// <remarks/>
        public System.Nullable<int> Endprova(System.IAsyncResult asyncResult) {
            object[ results = this.EndInvoke(asyncResult);
            return ((System.Nullable<int>)(results[0]));
        }
       
        /// <remarks/>
        public void provaAsync(System.Nullable<int> in0, System.Nullable<int> in1) {
            this.provaAsync(in0, in1, null);
        }
       
        /// <remarks/>
        public void provaAsync(System.Nullable<int> in0, System.Nullable<int> in1, object userState) {
            if ((this.provaOperationCompleted == null)) {
                this.provaOperationCompleted = new System.Threading.SendOrPostCallback(this.OnprovaOperationCompleted);
            }
            this.InvokeAsync("prova", new object[ {
                        in0,
                        in1}, this.provaOperationCompleted, userState);
        }
       
        private void OnprovaOperationCompleted(object arg) {
            if ((this.provaCompleted != null)) {
                System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
                this.provaCompleted(this, new provaCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
            }
        }
       
        /// <remarks/>
        public new void CancelAsync(object userState) {
            base.CancelAsync(userState);
        }
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
    public delegate void provaCompletedEventHandler(object sender, provaCompletedEventArgs e);

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class provaCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
       
        private object[ results;
       
        internal provaCompletedEventArgs(object[ results, System.Exception exception, bool cancelled, object userState) :
                base(exception, cancelled, userState) {
            this.results = results;
        }
       
        /// <remarks/>
        public System.Nullable<int> Result {
            get {
                this.RaiseExceptionIfNecessary();
                return ((System.Nullable<int>)(this.results[0]));
            }
        }
    }
     

  • 12-14-2007 1:38 PM In reply to

    Re: Info Varie

    Ciao, tutto quello che devi rimuovere dalla classe affinchè sia compatibile con il compact framework, sono i metodi per le chiamate asincrone, perchè il CF non è in grado gestirle, poichè la tua applicazione non può fare uso delle strutture multithread disponibili in una applicazione desktop. Nel CF la tua applicazione ha 1 thread attivo ed uno soltanto. Non avrebbe quindi senso inserire il supporto alle chiamate async che richiedono l'utilizzo di più thread.

    Devi aggiungere al tuo progetto un riferimento a System.Web.Services

    Detto questo ecco come la tua classe deve essere modificata ( ho inserito un commento "=pp= removed" su tutte le parti che ho commentato per rendere la classe compatibile con il CF).
    No ho potuto fare un test, se non verificare che la classe viene compilata in modo corretto, poichè non ho il WebService.

    Ciao


    //------------------------------------------------------------------------------
    // <auto-generated>
    //     Il codice è stato generato da uno strumento.
    //     Versione runtime:2.0.50727.832
    //
    //     Le modifiche apportate a questo file possono provocare un comportamento non corretto e andranno perse se
    //     il codice viene rigenerato.
    // </auto-generated>
    //------------------------------------------------------------------------------

    using System;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Web.Services;
    using System.Web.Services.Protocols;
    using System.Xml.Serialization;

    //
    // Codice sorgente generato automaticamente da wsdl, versione=2.0.50727.42.
    //


    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Web.Services.WebServiceBindingAttribute(Name="pieroTestHttpBinding", Namespace="http://DefaultNamespace")]
    public partial class pieroTest : System.Web.Services.Protocols.SoapHttpClientProtocol {
       
        // =pp= removed
        //private System.Threading.SendOrPostCallback provaOperationCompleted;
       
        /// <remarks/>
        public pieroTest() {
            this.Url = "http://carpoolsrv:8080/tryalWS/services/pieroTest";
        }
       
        // =pp= removed
        ///// <remarks/>
        //public event provaCompletedEventHandler provaCompleted;
       
        /// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("", RequestNamespace="http://DefaultNamespace", ResponseNamespace="http://DefaultNamespace", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
        [return: System.Xml.Serialization.XmlElementAttribute("out", IsNullable=true)]
        public System.Nullable<int> prova([System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] System.Nullable<int> in0, [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] System.Nullable<int> in1) {
            object[ results = this.Invoke("prova", new object[ {
                        in0,
                        in1});
            return ((System.Nullable<int>)(results[0]));
        }
       
        /// <remarks/>
        public System.IAsyncResult Beginprova(System.Nullable<int> in0, System.Nullable<int> in1, System.AsyncCallback callback, object asyncState) {
            return this.BeginInvoke("prova", new object[ {
                        in0,
                        in1}, callback, asyncState);
        }
       
        /// <remarks/>
        public System.Nullable<int> Endprova(System.IAsyncResult asyncResult) {
            object[ results = this.EndInvoke(asyncResult);
            return ((System.Nullable<int>)(results[0]));
        }
       
        // =pp= removed
        ///// <remarks/>
        //public void provaAsync(System.Nullable<int> in0, System.Nullable<int> in1) {
        //    this.provaAsync(in0, in1, null);
        //}
       
        // =pp= removed
        ///// <remarks/>
        //public void provaAsync(System.Nullable<int> in0, System.Nullable<int> in1, object userState) {
        //    if ((this.provaOperationCompleted == null)) {
        //        this.provaOperationCompleted = new System.Threading.SendOrPostCallback(this.OnprovaOperationCompleted);
        //    }
        //    this.InvokeAsync("prova", new object[ {
        //                in0,
        //                in1}, this.provaOperationCompleted, userState);
        //}

        // =pp= removed
        //private void OnprovaOperationCompleted(object arg) {
        //    if ((this.provaCompleted != null)) {
        //        System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
        //        this.provaCompleted(this, new provaCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
        //    }
        //}

        // =pp= removed
        ///// <remarks/>
        //public new void CancelAsync(object userState) {
        //    base.CancelAsync(userState);
        //}
    }

    // =pp= removed
    ///// <remarks/>
    //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
    //public delegate void provaCompletedEventHandler(object sender, provaCompletedEventArgs e);

    // =pp= removed
    ///// <remarks/>
    //[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
    //[System.Diagnostics.DebuggerStepThroughAttribute()]
    //[System.ComponentModel.DesignerCategoryAttribute("code")]
    //public partial class provaCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {

    // =pp= removed
    //    private object[ results;

    // =pp= removed   
    //    internal provaCompletedEventArgs(object[ results, System.Exception exception, bool cancelled, object userState) :
    //            base(exception, cancelled, userState) {
    //        this.results = results;
    //    }

    // =pp= removed
    //    /// <remarks/>
    //    public System.Nullable<int> Result {
    //        get {
    //            this.RaiseExceptionIfNecessary();
    //            return ((System.Nullable<int>)(this.results[0]));
    //        }
    //    }
    //}
     

Page 1 of 3 (35 items) 1 2 3 Next >
dotNet Umbria 2007-2008
Powered by Community Server (Commercial Edition), by Telligent Systems