2009-01-16 4 views
10

In einer ASP.Net-Anwendung muss ich einige Daten (URLEncodedUserInput) über HTTP POST an einen externen Server als Reaktion auf Benutzereingaben senden , ohne die Seitenantwort zu halten. Es spielt keine Rolle, was die Antwort vom anderen Server ist, und es ist mir egal, ob die Anfrage manchmal fehlschlägt. Dies scheint in Ordnung zu sein (siehe unten), aber ich bin besorgt, dass es Ressourcen im Hintergrund bindet und auf eine Antwort wartet, die niemals verwendet wird.So senden Sie HTTP-Anfrage in asp.net, ohne auf eine Antwort warten und ohne Ressourcen zu binden

Hier ist der Code:

httpRequest = WebRequest.Create(externalServerUrl); 

httpRequest.Method = "POST"; 
httpRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8"; 

bytedata = Encoding.UTF8.GetBytes(urlEncodedUserInput); 
httpRequest.ContentLength = bytedata.Length; 

requestStream = httpRequest.GetRequestStream(); 
requestStream.Write(bytedata, 0, bytedata.Length); 
requestStream.Close(); 

ziemlicher Standard, aber in der Regel an diesem Punkt würden Sie nennen httpRequest.getResponse() oder httpRequest.beginGetResponse(), wenn Sie die Antwort asynchron, aber das doesn erhalten wollte scheint in meinem Szenario nicht notwendig zu sein.

Mache ich das Richtige? Sollte ich httpRequest.Abort() aufrufen, um aufzuräumen, oder könnte dies verhindern, dass die Anfrage über eine langsame Verbindung gesendet wird?

Antwort

7

Ich denke, Threadpool.QueueUserWorkItem ist, was Sie suchen. Mit dem Zusatz von Lambda-Ausdrücke und anonyme Typen, kann dies ganz einfach sein:

var request = new { url = externalServerUrl, input = urlEncodedUserInput }; 
ThreadPool.QueueUserWorkItem(
    (data) => 
    { 
     httpRequest = WebRequest.Create(data.url); 

     httpRequest.Method = "POST"; 
     httpRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8"; 

     bytedata = Encoding.UTF8.GetBytes(data.input); 
     httpRequest.ContentLength = bytedata.Length; 

     requestStream = httpRequest.GetRequestStream(); 
     requestStream.Write(bytedata, 0, bytedata.Length); 
     requestStream.Close(); 
     //and so on 
    }, request); 
0

Die einzige Art, wie ich mir vorstellen kann, dass Sie eine schnelle Antwort von der anderen Anfrage bekommen würde, ist die Seite, die Sie gerade veröffentlichen zu Öffnen Sie mithilfe von ThreadPool.QueueUserWorkItem einen Thread, damit der Hauptthread die Antwort beendet, bevor die zeitraubende Arbeit abgeschlossen ist. Sie sollten wissen, dass sobald der Hauptthread beendet wird, Sie keinen Zugriff auf den HttpContext haben, was bedeutet, dass kein Caching, Servervariablen, etc ... auch freigegebene Laufwerke funktionieren, außer Sie nehmen einen Benutzer mit Berechtigungen im neuen Thread an. Threads sind nett, aber es gibt viele Dinge zu beachten.