2017-07-24 2 views
0

Ich versuche Hangfire zu verwenden, um die Verarbeitung von Daten, die über eine HttpHandler erfasst wurden, in die Warteschlange zu stellen.Wie wird die Hangfire-Jobwarteschlange für die Verarbeitung von Anforderungen von ASP.NET HttpHandler verwendet?

Der Hangfire-Server ist korrekt konfiguriert und funktioniert gut mit einfachen Funktionen wie die here erläutert.

Ich kann keinen Weg finden, meine HttpContext Daten zu verwenden, um mit Hangfire zu arbeiten.

Dieser Code funktioniert:

public void ProcessRequest(HttpContext context) 
     { 
      var jobId = BackgroundJob.Enqueue(
       () => Console.WriteLine("HELLO") 
      ); 
     } 

Dieser Code nicht funktioniert:

public void ProcessRequest(HttpContext context) 
     { 
      var jobId = BackgroundJob.Enqueue(
       () => doServerSideWork(context) 
      ); 
     } 

public void doServerSideWork(HttpContext context) 
     { 
      context.Response.ContentType = "text/plain"; 
      context.Request.InputStream.Position = 0; 
      var jsonString = String.Empty; 
      using (var inputStream = new StreamReader(context.Request.InputStream)) 
      { 
       jsonString = inputStream.ReadToEnd(); 
      } 
      context.Response.Write(jsonString); 
     } 

Ich erhalte eine BackgroundJobClientException:

{ "selbstbeziehende Schleife für Eigenschaft erkannt ' Context 'mit dem Typ ' System.Web.HttpContext '. Pfad' ApplicationInstance '. "}

Nach dem Lesen des Themas, scheint es wie eine HttpContext kann nicht serialisiert werden, die der erste Schritt in der Job-Management Hangfire ist (siehe vorherigen Link).

Wie kann ich mit Hangfire meine HTTP-Anfragen behandeln?

+0

Dies wird nie funktionieren. Sie können nicht einfach einen HTTP-Kontext für Threads wie diesen übergeben und erwarten, dass Sie am Ende auf die Response zurückschreiben können. Hangfire sollte nicht für diese Art von Arbeit verwendet werden. Warum verwenden Sie nicht async/erwarten in Ihrem Controller? –

Antwort

3

Kurze Antwort: Es ist unmöglich

Lange Antwort: Es ist von Natur aus unmöglich später ein Httpcontext und wirken auf sie serialisiert werden. Wenn die "Hintergrundarbeit" so einfach ist wie das Code-Snippet, das Sie gezeigt haben, sollten Sie async/await verwenden, um das Blockieren von Threads zu vermeiden und Ihren Server so ansprechend wie möglich zu halten. Wenn die Hintergrundarbeit tatsächlich CPU-gebunden ist und es nicht möglich ist, async/await zu verwenden, müssen Sie die Daten aus dem HttpContext extrahieren, der für das Starten Ihrer Arbeit relevant ist, und diese stattdessen übergeben. In diesem Fall sollten Sie sofort eine Antwort an den Client zurücksenden, indem Sie ihm eine Rückrufadresse geben, wo er entweder nach Updates suchen kann oder in Echtzeit mit einem Websocket benachrichtigt wird, wenn der Job abgeschlossen ist.

+0

Danke. Eigentlich besteht der Zweck meiner App darin, eine Client-Datenbank mit einer Server-Datenbank zu synchronisieren. Ich möchte einen Warteschlangenprozess implementieren, weil ich nicht mehrere parallele Synchronisierungsprozesse möchte. Es muss jeweils nur ein Synchronisationsprozess ausgeführt werden. – kaycee

+0

np, ich bin froh, dass es geholfen hat –

Verwandte Themen