Thursday, 28 May 2009
AUTENTICAZIONE MULTIAZIENDA CRM 4: esempio di codice
Thursday, 28 May 2009 08:52:44 (W. Europe Standard Time, UTC+01:00)  #    Disclaimer  |  Comments [0]  | 
 Monday, 25 May 2009

   Spesso quando si fanno massicce chiamate alla platform del CRM via servizi web (si parla di decine o centinaia di migliaia di chiamate ad esempio durante un'importazione massiva), si può ottenere un errore di socket il cui messafggio è una frase del tipo "Non è possibile aprire più connessioni su una stessa porta".

Questo comportamento è legato all'IIS e non al codice del CRM o dello sviluppatore. Ogni server web rimane costantemente in ascolto su alcune pèorte TCP sulle quali sono attestati i siti. L'esempio più diffuso è quello della porta 80: siccome un sito è acceduto da più utenti in contemporanea, quando IIS riceve una chiamata sulla porta 80 la evade aprendo una connessione su una porta alta; questo perchè la porta 80 deve rimanere libera per le altre richieste. Le porte alte non utilizzate dalla macchina vengono quindi aperte con un socket e i flussi HTTP passano attraverso di esse. Ogni socket rimane aperto per un tempo stabilito e il range di porte alte da usare è scritto nel registro di sistema. Se le chiamate ai servizi web (un socket aperto per chiamata) sono molte e in rapida successione può succedere che il range di cui sopra si esaurisca, IIS ricomincia dai valori bassi di tale range trovando però i socket ancora aperti dalla chiamata precedente e scatendando quindi l'errore.

SOLUZIONE: per risolvere il problema bisogna intervenrire sulla configurazione di IIS in due modi NON mutualmente esclusivi. Bisogna però porre molta attenzione perchè eventuali errori potrebbero causare gravi errori nels erver web.

1) Diminuire il tempo di apertura dei socket (il default è 240 secondi): si va nella seguente chiave di registro e si modifica il valore ad esempio portandolo da 4 minuti a 30 secondi:
HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\TCPTimedWaitDelay

2) Aumentare il range di porte alte che l'IIS usa per evadere le richieste: si va nella seguente chiave di registro e si modificano ni valori di conseguenza portandoli ad esempio dal default che è 5000 a 65000:
HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort

Si riavia IIS.

Monday, 25 May 2009 08:42:51 (W. Europe Standard Time, UTC+01:00)  #    Disclaimer  |  Comments [0]  |