ThinkMobile.it • Oggi nasce ufficialmente la prima comunità italiana dedicata allo sviluppo mobile su piattaforma Microsoft • Blogs e Forum tematici • All’apertura • Blog di Rob e Fabio e Front (Marco) • Forum su Sviluppo Client-Side, Server-side, Nativo, Architettura App (MSMQ, SQLCE, Web Service, SOA) • Pensi di avere qualcosa da comunicare ? • Richiedi l’apertura di un tuo blog a [email protected] ([email protected]) Scambio Informazioni Roberto Brunetti [email protected] http://blogs.devleap.com/rob http://thinkmobile.it/blogs/rob Socket • Namespace System.Net.Sockets • Identico al Desktop • Sincrone / Asincrone • Vari Protocolli • GGP-ICMP-IDP-IGMP-IP-IPV6-IPX-ND-PUP-RAW-SPX-SPXII-TCPUDP • Paradigma Send / Receive • Supporto Async • BeginSend / BeginReceive • BeginAccept / EndAccept • Dopo un esempio con Fabio HttpWebRequest Dim Req as HttpWebRequest Req = CType(WebRequest.Create (http://xxx.com/Pippo.xml, HttpWebRequest) Dim Resp as HttpResponse Resp = Req.GetResponse() Scenari • Applicazione stand-alone • Scambio dati con ActiveSync (Cradle, Server) • Magazzino Wi-Fi • Accesso diretto al database ?!? • Agente esterno che prende ordini • Serve store locale di informazioni • DataSet salvato in locale, SQL CE • Meccanismo di replica dati • SQLCE nativo, MSMQ, Web Service • Vogliamo avere comunicazioni Server Client • HTTPD su Windows CE (solo ASP) • Socket • MSMQ Scelte accesso ai dati .NET Compact Framework 4. ADO.NET Dati Locali 1. XML Web Service XML Web Service 2. Accesso SQL Server SQL Server CE SQL Server 3. Sincronizzazione Windows CE (http) Windows Server Scelte Accesso ai Dati • 1. XML Web services • Riutilizzo Web service (desktop, mobile web ecc.) • Incapsulamento Business Logic • Non solo dati... Operazioni/Calcoli etc • 2. Direct SQL Server • Più semplice per applicazioni sempre on-line • Business Logic sul client (Client / Server) • 3. SQL Server CE Synch • Utilizzo di dati locali • Sincronizzazione auto/granulare dei dati • Applicazioni Off-line • 4. Local data access • Utilizzo di store locale per applicazioni Off-line • Utilizzo ADO .NET, SQL Server CE, XML Web Service .NET • Documento .ASMX pubblicato sul Web • Namespace: System.Web.Services • Direttiva: <%@ WebService Language=“???” Class=“???” %> • Associare alla classe dei WebMethod: [WebMethod()] public String LeggiDato() { … } • Si basano sulla serializzazione XML (System.Xml.Serialization) e sul motore di ASP.NET .NET CF e WS • Identico al .NET Framework • Da VS.NET • Add Web Reference verso il file WSDL • Assegnare un nome • Utilizzo tradizionale Dim x as New XXXXX.Servizio() X.Metodo() • Demo DLMobility • SimpleVBRichiClient\ SimpleWebServiceVBRichClientServer Servizi asincroni sul client • Sul client • XXX(args) • BeginXXX(args, AsyncCallBack, AsyncState) • EndXXX(IAsyncResullt) • Controllo: • IsCompleted • WaitHandle • AsyncCallback • Demo DLMobility • SimpleVBRichClient/SimpleWebServiceVBRichClientServer Web Service Application Windows Forms ASP.NET ADO.NET WS Client Database Local Data .NET Framework .NET Compact Framework • Pro • • • • HTTP Caching con WriteXml Sincronizz. sul Server Nessun bridge • Contro • • Logica di sincronizzazione da gestire Peso del trasferimento dei dati XML DataSet • Il DataSet supporta nativamente la rappresentazione dei suoi contenuti in formato XML: • • • • • • WriteXml WriteXmlSchema GetXml GetXmlSchema ReadXml ReadXmlSchema • 2x in Lettura con Schema ! Un Web Service di aggiornamento dati • Un Web Service potrebbe: • Fornire dei dati sotto forma di DataSet • Riottenere i dati modificati (magari solo le righe che sono cambiate) • Aggiornare in modalità batch il data base • ATTENZIONE: • Dobbiamo prestare attenzione ai conflitti dovuti ad accessi concorrenti • Demo DLArchitectingDAL 11 • Lettura e Update semplice • Volendo Trace 8080 GetChanges (Delta) public DataSet GetChanges(DataRowState rowStates) { DataSet set1 = null; if (!this.HasChanges(rowStates)) { return null; } set1 = this.Clone(); //Copia Schema, Relazioni e Constraint (non Dati) bool flag1 = set1.EnforceConstraints; set1.EnforceConstraints = false; foreach (DataTable table1 in this.Tables) { DataTable table2 = set1.Tables[table1.TableName]; foreach (DataRow row1 in table1.Rows) { if (this.ShouldWriteRowAsUpdate(row1, rowStates)) table1.CopyRow(table2, row1); } } set1.EnforceConstraints = flag1; return set1; } ..cont...ShouldWriteRowAsUpdate internal bool ShouldWriteRowAsUpdate(DataRow row, DataRowState _rowStates) { DataRowState state1 = row.RowState; if (((int) (state1 & _rowStates)) != 0) { return true; } for (int num1 = 0; num1 < row.Table.ChildRelations.Count; num1++) { DataRowVersion version1 = (state1 == DataRowState.Deleted) ? DataRowVersion.Original : DataRowVersion.Current; DataRow[] rowArray1 = row.GetChildRows(row.Table.ChildRelations[num1], version1); for (int num2 = 0; num2 < rowArray1.Length; num2++) { if (this.ShouldWriteRowAsUpdate(rowArray1[num2], _rowStates)) { return true; } } } return false; } typed DataSet • Classi derivate da DataSet • DataTable, DataRow e DataColumn con una forte tipizzazione • Possiamo ottenerli a partire da file XSD • Con il designer di Visual Studio .NET • Con XSD.EXE /dataset file.xsd • NB: Non sono supportati dal Compact Framework 1.0 !!! • Manca la Serializzazione quindi difficile per uso con WS • Si possono usare ma non serializzare • Oppure con molti “mastruzzamenti” ci si arriva • OK nella versione 2.0 del .NET CF WS: Stato dell’arte • XML Signature • XML Encryption • WSA • • • • WS-I: Consorzio per trovare standard veri WS-Security WS-Trust WS-SecureConversation • WSE 2 SP3 per l’ambiente Desktop • OpenNETCF 1.3 SQL Server for Windows CE eVB 3.0 ADO CE v3.0 Active X Objects eVC 3.0 OLEDB CE SQL Server 2000 Windows CE Edition OLEDB QP/Cursor Engine/ES OLEDB Client Agent: Replication IIS HTTP Server Agent: Replication and Remote Data Access Storage Engine / Repl Tracking CLIENT SERVER Sincronizzazione • Due metodologie • RDA – Remote Data Access • SQL Server 6.5 Service Pack 5 + • Merge Replication con SQL 2000 • SQL Server puo’ fare da ponte verso altri database • Utilizzando i Linked Server • L’utilizzo di tabelle locali ha comunque senso per ridurre la banda Con .NET .NET CF / Managed Stack VS .NET (VB.NET, C#) Native/Unmanaged Stack eVB 3.0 ADO CE v3.1 ADO.NET eVC 3.0 SQL Server CE Data Provider SQL Server Client Data Provider CLR / .NET CF Ethernet TDS Scenario Connesso OLEDB CE SQL CE Edition v2.0 Data Provider OLEDB QP/Cursor Engine/ES OLEDB Client Agent: Replication and RDA Storage Engine / Repl Tracking 802.11b, CDPD, GSM, CDMA, TDMA, etc. IIS HTTP Scenario Disconnessos CLIENT SERVER OLEDB / Replication API Server Agent: Replication and Remote Data Access MSMQ on Windows CE “Realtà” Distribuita • Più macchine, più reti • Molte apps non sono 100% online • Molte “reti” non sono 100% disponibili • Scenari di malfunzionamento “moltiplicati” • I danni possono essere dispendiosi • Scenari Home Office, Mobile (e disconnected) possibili • Carichi di lavoro in base a priorità • Accessi concorrenti MSMQ • Servizio di comunicazione • Asyncronous Comunication • Velocità diverse (App:App, Machine:Machine) • Offline • Message Delivery garantito • Routing di messaggi • Priority-based Architettura Machine 1 Application 1 Application 2 MSMQ API Open Rec’v Send Close Queue manager ‘A’ ‘B’ Msg queues ‘C’ Sys Sys I messaggi sono mantenuti in code Le code sono gestite da gestori di code Le apps accedono a MSMQ via semplici API o oggetti COM System • MSMQ rende possibile lo scambio di messaggi fra programmi MSMQ: Configurazione • MSMQ Server • • • • • Queue manager Routing service Directory service MSMQ Explorer Applicazione Client locale • MSMQ-dependent client • Nessun queue manager • Richiede un MSMQ Server • MSMQ-independent client • Queue manager MSMQ Servers • Store di messaggi Instrada messaggi Supporta applicazioni locali Supporta accesso da client remoti Fornisce MSMQ Explorer Topologie di rete Routing Gestione Application 1 Application 2 MSMQ Server API Open Rec’v Send Close Client proxy server Information server Queue manager Routing server ‘A’ ‘B’ ‘C’ Sys Sys MSMQ-Independent Client • Invia e riceve messaggi Application 1 Memorizza messaggi Opera anche off-line Non supporta dependent client Non può agire da MSMQ router Obbligatorio per i portatili disconnessi Application 2 MSMQ Workstation API Open Rec’v Send Close Queue manager ‘A’ ‘B’ ‘C’ Sys Sys Scenario App -> Server App A Internet App B • • App A sul device invia messaggi a code public o private su un server App B sul server scoda • • Volendo transazionalmente Levo il messaggio solo se TX su DB a buon fine Scenario Device - Device LAN only App A App B • • • App B crea una coda privata locale App A invia messaggi alla coda dell’altro device App B legge i messaggi dalla coda locale • N.B: MSMQCE può scrivere ma non leggere da code remote MSMQ on Windows CE 3.0 • Indipendent Client • Non necessita di infrastruttura • Può lavorare come client tradizionale • Singola Coda • Sending/Receiving • Sul device o su un altro device raggiungibile • Se non raggiunbile si può passare da un server • Delivery • Express • Recoverable • Transaction Single-Message • Ordinamento • Delivery Exactly Once MSMQ on Windows CE 3.0 • • • • Message Prioritization Message Label Journaling Supportato Network Tracking • Instant Reconnection • Regitry per configurazione • Accesso by Computer Name • No IP Diretto • Name Resolution • Necessario DNS o WINS: lookup e reverse lookup • Unique name dei vari device • NETREGD: utility per registrare CE in WINS Demo App to App Application A Messages MSMQ Messages Application B • Solo Codice DLMobility/MSMQ20/EstatesManagement20 • Send • Receive • ReceiveAsync • Tornare sul desktop • Stesse righe di codice • Visualizzazione code da Computer Manager • O MSMQ Explorer • Stesse demo Peek / Receive • Peek • Legge un messaggio in coda • Mettendo a disposizione le proprietà • Filtri per ricercare i messaggi basati su proprietà MsmqMessage • Lascia il messaggio in Coda • Receive • Legge un messaggio • Mettendo a disposizione le proprietà • Filtri per ricercare i messaggi basati su proprietà MsmqMessage • Leva il messaggio dalla Coda Recoverable • Message.Recoverable Message m = new Message(); m.Body = orderObject1; m.Recoverable = true; // guaranteed delivery • True • Il delivery è assicurato (salva il messaggio su “disco”) • Durante tutta la strada • Più lento e consuma più risorse • Sopravvive a reboot • False (Default) • Delivery non garantito • Veloce e leggero • Possibile perdita dei messaggi Transaction • I messaggi recoverable sono garantiti ma • Possono essere spediti più di una volta • Possono essere spediti in ordine “sparso” • Messaggi transazionali • Exactly-Once / In-Order • Supporto solo per Single Internal Transaction • Nessun supporto per MTS/COM+ • Occorre creare code transazionali • E usare i parametri seguenti MessageQueue mq = new MessageQueue(@".\Private$\TranQ", true); Message m = new Message(); m.Body = orderObject1; mq.Send(m, MessageQueueTransactionType.Single); Timeout Proprietà Significato Message.TimeToReachQueue Message.TimeToBeReceived Tempo per raggiungere la coda e per essere letto Assicurarsi la sincronia dei clock o casini !!! Message.AdministrationQueue Coda associabile al messaggio. Riceverà messaggi sull’avvenuta spedizione/ricezione/lettura Message.AcknowledgementType Tipo di Ack richiesto NegativeReceive, PositiveReceive, FullReceive Message.UseDeadLetterQueue Usa coda di sistema machine\Deadletter$ false – messaggi non spediti persi true – copia dei messaggi non spediti nella Dead Letter Queue Jounaling Si può decidere di tenere una copia di ogni messaggio nella coda di sistema Admin Queue // Creo Coda amministrativa MessageQueue.Create(@".\private$\AdminQueue"); // Messaggio Message myMessage = new Message(“Ciao Ciao"); myMessage.AdministrationQueue = new MessageQueue(@"PPCDEVICE\private$\AdminQueue"); myMessage.AcknowledgeType = AcknowledgeTypes.FullReceive; myMessage.TimeToBeReceived = new TimeSpan(0,0,5); // Invio normale MessageQueue myQueue = new MessageQueue(@“SERVER\private$\myQueue"); myQueue.Send(myMessage); // Recupero il MessageID per interrogare coda admin string messageId = myMessage.Id; • N.B Il messaggio non arriva o viene cancellato se non letto entro il timeout (Timeout 5 secondi) Admin Queue // Controllo coda amministrativa MessageQueue admQueue = new MessageQueue(@".\private$\AdminQueue"); // Imposto filtro per CorrelationID e Acknoledgment admQueue.MessageReadPropertyFilter.CorrelationId = true; admQueue.MessageReadPropertyFilter.Acknowledgment = true; // Cerco su CorrelationID per MessageID originale Message messageAck = admQueue.ReceiveByCorrelationId( myMessageId, TimeSpan.FromSeconds(30.0)); // Visualizzo il risultato di Ack MessageBox.Show(messageAck.Acknowledgment.ToString()); Passo successivo • Ho bisogno di una risposta dall’applicazione che processa i messaggi • Imposto ReponseQueue sul messaggio per indicare dove voglio la risposta • Il ricevente legge msg.ResponseQueue per inviare le risposte • Leggo la coda indicata come ReponseQueue per vedere le risposte Abbiamo ancora tempo ? • Installazione (Platform SDK) • C:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Support\Msmq • Copiare i file sotto \Windows • Per il processore corretto come sempre • N.B. Emulatore • X86 VS.NET 2003 e Platform SDK • ARM VS 2005 • • • • Dare un Nome al Device VisAdm.exe -> Shortcuts -> Install VisAdm.exe -> Shortcuts -> Register Soft Reset Starting MSMQ On The Device • Alcuni device hanno già tutto • Per gli altri • msmqadm.exe - msmqadmext.dll - msmqd.dll msmqrt.dll - visadm.exe • Si trovano in Windows Mobile 2003 SDKs • C:\Program Files\Windows CE Tools\ wce420\{device}\Support\msmq\armv4 • Usare \armv4 (non \x86) per Emulatori di VS 2005 ! • Per Windows Mobile 5.0 • MSMQ CAB file Starting MSMQ • File Explorer \windows\visadm.exe • Install • Register • Verify • Start • Status Installazione da codice • Runtime file nel progetto • Build Action a Content • Copy to Output Directory a Copy if Newer • Codice per copiarli sotto \Windows • CreateProcess per chiamare msmqadm.exe per installare e far partire il servizio MQ: la soluzione a tutto ? • Molte realtà necessitano di diverse tecniche di comunicazione • Può essere un overhead significativo • Quando il mittente necessita di info dal destinatario • Single server o piccola LAN • Installazione e programmazione • Non offre un “all-or-nothing” distribuito • Per definizione comunicazioni Asincrone • Non offre supporto per i dati • Non ha un DB, non è un DB • Affiancabile a SQL CE o SQL Server Comparazione HTTP Support Handling Network Availability Security Facilità Deployment Server config MSMQ ¹ Web services ³ Sockets ² ³ SQL Mobile RDA ³ 1. MSMQ HTTP non supportato da Windows Mobile 3.0 2. System.Net.HttpWebRequest\WebResponse usano le Socket 3. Web services, Sockets e SQL Mobile richiedono codice per capire lo stato della connessione © 2004 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS SUMMARY. Content created by 3 Leaf Solutions