Verwenden von WebClient in ASP.NET MVC asynchron?

8

Ich habe eine ASP.NET MVC-Anwendung, die derzeit die WebClient-Klasse verwendet, um einen einfachen Aufruf an einen externen Webdienst innerhalb einer Controller-Aktion durchzuführen.

Momentan verwende ich die DownloadString-Methode, die synchron läuft. Ich bin auf Probleme gestoßen, bei denen der externe Webdienst nicht mehr reagiert, was dazu führt, dass meine gesamte ASP.NET-Anwendung nicht mehr reagiert und nicht mehr reagiert.

Was ist der beste Weg, um dieses Problem zu beheben? Es gibt eine DownloadStringAsync-Methode, aber ich weiß nicht, wie ich diese vom Controller aufrufen soll. Muss ich die AsyncController-Klasse verwenden? Wenn ja, wie interagieren der AsyncController und die DownloadStringAsync-Methode?

Danke für die Hilfe.

    
Brian Vallelunga 08.08.2009, 15:43
quelle

2 Antworten

7

Ich denke, die Verwendung von AsyncControllern wird Ihnen hier helfen, da sie die Verarbeitung des Anforderungsthreads auslagern.

Ich würde so etwas verwenden (unter Verwendung des Ereignismusters wie in dieser Artikel ):

%Vor%

Und stellen Sie sicher, dass Sie alle erforderlichen Routen einrichten, zB (in Global.asax.cs):

%Vor%     
Michael Hart 09.08.2009, 05:10
quelle
3

Die DownloadStringAsync-Methode verwendet ein Ereignismodell, wodurch die DownloadStringCompleted -Anwendung ausgelöst wird wenn es fertig ist. Sie können die Anforderung auch stoppen, wenn sie zu lange dauert, indem Sie WebClient.CancelAsync() aufrufen. Dadurch können Ihr Hauptanfragen-Thread und Ihr WebClient-Thread parallel ausgeführt werden und Sie können genau entscheiden, wie lange Ihr Haupt-Thread warten soll, bevor er zurückkehrt.

Im folgenden Beispiel starten wir den Download und setzen den Event-Handler, der aufgerufen werden soll, wenn er fertig ist. Der DownloadStringAsync wird sofort zurückgegeben, sodass wir den Rest unserer Anfrage weiter bearbeiten können.

Um eine detailliertere Kontrolle über diesen Vorgang zu demonstrieren, können wir, wenn wir das Ende unserer Controller-Aktion erreicht haben, prüfen, ob der Download noch abgeschlossen ist. Wenn nicht, geben Sie ihm 3 weitere Sekunden und brechen Sie dann ab.

%Vor%     
Rex M 08.08.2009 16:00
quelle