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
Scarica

Slide 1 - Microsoft