442 messaggi dal 09 marzo 2006
Ciao a tutti.
Cos e di preciso il keep alive? Ho letto che riutilizza la stessa connessione e io devo inviare via restsharp piu di mille pacchetti post a un web service rest di continuo, in fila. Questo velocizzerebbe molto il mio lavoro.
Ha un timeout il keep alive?
Cambia a seconda dei server?
Come faccio ad utilizzarlo ad es in restsharp?sia in app win che xamarin?
Grazie.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Giuseppe,
il Keep-Alive è un'intestazione HTTP inviata dal client che invita il server a tenere aperta una connessione TCP persistente, in modo che il client possa riusarla per inviare ulteriori richieste HTTP. La specifica elenca vari vantaggi di questa tecnica, tra cui:
Latency on subsequent requests is reduced since there
is no time spent in TCP's connection opening handshake.


giuseppe500 ha scritto:

Ha un timeout il keep alive?

Questo dipende dalla particolare implementazione del server. La specifica dice semplicemente questo:
A client, server, or proxy MAY close the transport connection at any time.


Penso che RestSharp utilizzi il keep alive per default, come indicato dalla documentazione di HttpWebRequest (che lui usa) ma se vuoi essere esplicito puoi aggiungere l'intestazione keep-alive alle tue richieste.
RestSharp ne terrà conto, come si evince dal suo codice sorgente.

giuseppe500 ha scritto:

Questo velocizzerebbe molto il mio lavoro.

Di sicuro il keep alive aiuta ma non aspettarti miglioramenti eccessivi.
L'ideale sarebbe se il webservice in questione accettasse una collezione di elementi anziché un solo elemento alla volta, oppure se supportasse il batching.
Inoltre, dovresti provare a comprimere il corpo della richiesta impostando l'intestazione "Content-Encoding" su "gzip" (sempre che il server la supporti).

Parla di queste cose con chi ha sviluppato il webservice.
Quello che puoi fare tu è inviare le richieste in background, per non far attendere inutilmente l'utente mentre avviene l'invio.

ciao,
Moreno
Modificato da BrightSoul il 09 ottobre 2016 23.41 -

Enjoy learning and just keep making
442 messaggi dal 09 marzo 2006
1)Ma quello che vorrei riuscire a capire e non so come fare (forse con strumenti tipo fiddler)è se il collo di bottiglia sta nella banda in upload della mia connessione o se altrimenti si puo migliorare la velocita.pensavo a un servizio con un dictionary di client gia instanziati per ogni risorsa cosi che non debba perdere tempo a instanziare il client e fare l autenticazione ma parlo senza sapere e quindi scusatemi è solo una domanda.
2) si il server accetta collezioni di oggetti solo che ho provato e oltre un certo numero inizia a sbagliare penso quindi per colpa della banda.
Mi chiedevo inoltre come attivare la conpressione gzip supportata dal server e se da qualche risultato.
Grazie.ciao.
Modificato da giuseppe500 il 17 ottobre 2016 10.24 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Giuseppe,
non ho capito se hai scritto tu il webservice e se hai il controllo del server.


se il collo di bottiglia sta nella banda in upload della mia connessione

Puoi usare la visualizzazione timeline di Fiddler per capire quanto dura ciascuna richiesta.
http://docs.telerik.com/fiddler/KnowledgeBase/Timeline
Comunque, già solo il fatto che invii dei dati via rete rallenta certamente l'esecuzione, specie se invii tanti oggetti in richieste singole. A prescindere che la tua connessione sia un collo di bottiglia o no, dovresti inviare risultati in batch per ottimizzare il trasferimento.


debba perdere tempo a instanziare il client

Istanziare il client è un'operazione molto rapida, non credo che ci siano possibilità di ottimizzazione considerevoli da quel punto di vista.
Non ho ben chiaro cosa intendi con "autenticarti": per ogni oggetto che invii al servizio effettui una precedente richiesta di autenticazione? Se è così, è un motivo in più per inviare gli oggetti in un batch.

si il server accetta collezioni di oggetti solo che ho provato e oltre un certo numero inizia a sbagliare

Questo sembra un problema di implementazione più che di banda. Infatti, se il problema fossero eventuali pacchetti arrivati corrotti al server, il protocollo TCP/IP li individuerebbe e chiederebbe al client di reinviarli. Tutto questo è trasparente e non devi preoccupartene.
Se il servizio "inizia a sbagliare", direi che quasi sicuramente il problema è nell'implementazione dell'operazione del servizio.
Dovresti però chiarire cosa significa che "inizia a sbagliare". Se si tratta di un errore causato da una richiesta troppo grande, cioè che supera il limite di bytes preimpostato nella configurazione, allora dovresti ridurre il numero di oggetti inclusi nel batch. Inizia con l'inviare 50 o 100 oggetti alla volta, già dovrebbe velocizzarsi di parecchio.


Mi chiedevo inoltre come attivare la conpressione gzip supportata dal server e se da qualche risultato.

Questo servirà a ridurre il tempo di trasferimento. I risultati dipenderanno dalla qualità della tua connessione: più è lenta e più ne apprezzerai i benefici.

Non hai detto che tipo di webservice hai lato server. WCF? Web API? L'abilitazione dipende dalla tecnologia che stai usando. Ecco una possibile soluzione per far accettare ad ASP.NET Web API una richiesta gzip.
http://stackoverflow.com/questions/12345292/how-do-enable-a-net-web-api-to-accept-g-ziped-posts

In generale, se vuoi monitorare le prestazioni del webservice lato server, puoi sfruttare varie soluzioni:

ciao,
Moreno

Enjoy learning and just keep making
442 messaggi dal 09 marzo 2006
No non ho fatto io il webservice, è il webservice di prestashop.
Comunque ero io che sbagliavo nell implementazione dei pacchetti multipli .
Ho scaricato fiddler.
E grazie delle tue utili risposte.
Grazie.

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.