Ho una situazione abbastanza strana.Strano comportamento con le classi uri e WebClient sul pacchetto SSIS
ho questo molto semplice pacchetto:
- Task "ottenere l'elenco" recupera una tabella di dati da un assieme con un colonna e un elenco di URL per essere eseguito in una variabile oggetto .
- Il "foreach" loop loop attraverso la variabile oggetto e carica l'URL in una stringa URL variabile
Il "run", chiama l'URL con questo codice (del 2005 in modo da Im bloccato con VB):
Dim myURI As New Uri("http://" + Dts.Variables("URL").Value.ToString()) Dim myWebClient As New System.Net.WebClient myWebClient.OpenReadAsync(myURI)
l'URL di essere chiamato è interno e solo legge i parametri ed esegue una serie di operazione che richiederà un certo tempo, è per questo che ho usato "OpenReadAsync"
Il mio problema è: se ho 4 URL da eseguire, il pacchetto ne esegue solo 2. Il ciclo si interrompe 4 volte, lo script è chiamato 4 volte (posso vedere se lo faccio il debug), la linea myWebClient.OpenReadAsync(myURI)
viene eseguita 4 volte con 4 valori diversi, ma vengono effettuate solo 2 chiamate all'URL.
Se eseguo nuovamente il pacchetto, vengono richiamati gli altri 2 URL, che dimostrano che non c'è niente di sbagliato nell'URL e Se richiamo i 4 url manualmente sul browser (su 4 schede per esempio) uno subito dopo, tutti producono il risultato atteso, il che dimostra che non c'è niente di sbagliato nel codice che analizza l'URL.
Quindi mi rimane il codice VB, è la prima volta che utilizzo uri e WebClient, quindi mi chiedo se sto facendo qualcosa di sbagliato. Ho anche provato ad aggiungere 5 secondi di sonno tra le chiamate, ma senza fortuna.
Qualsiasi aiuto sarebbe apprezzato. Grazie
Che cosa succede se si passa sopra a utilizzando il metodo sincrono OpenRead? – billinkc
Ciao billinkc! Ottengo un timeout dopo la seconda esecuzione. È strano perché i 4 url che ho dovrebbero essere eseguiti in pochi secondi, infatti posso vedere (ho un log) che il secondo ha funzionato 5 secondi dopo il primo. E se eseguo il pacchetto la seconda volta, i 2 url rimanenti vengono eseguiti correttamente, quindi definitivamente è qualcosa con il fatto di chiamare il codice più di 2 volte – Diego
Ogni volta che mi imbatto in problemi di codice "strani" in SSIS, faccio il dump del codice accedere a un'app console .NET e vedere se riesco a riprodurre il comportamento lì. Immagino che tu l'abbia già provato, ma nel caso non lo avessi fatto, quello potrebbe essere un posto in cui girare visto visto che non c'è stato molto amore per la tua generosità. Inoltre, come è il tuo codice completo? Qualche possibilità che vengano chiamati tutti e 4 gli URL, ma dal momento che sono chiamate asincrone, non osservi gli effetti solo più tardi? Cosa succede se metti un thread.sleep più lungo, qualcosa per abbinare la durata del processo previsto? Sconfigge lo scopo di asincrono, lo so ma può far luce un po 'di luce – billinkc