2016-04-27 14 views
0

Ich versuche, den benutzerdefinierten Web-Handler von Webforms-Projekt nach MVC zu migrieren. Es funktionierte gut dort und rief asynchrone ProcessRequest.Async-Web-Handler funktioniert nicht in MVC

public class MyHandler : IHttpHandler 
{ 
    ... 
    public async void ProcessRequest(HttpContext context) 
    { 
    ... 

Allerdings, wenn ich es in meinem MVC-Projekt (/Content/MyHandler.ashx) laufen, bekomme ich folgende Fehlermeldung:

Eine asynchrone Operation kann zu diesem Zeitpunkt nicht gestartet werden. Asynchrone Operationen können nur innerhalb eines asynchronen Handlers oder Moduls oder während bestimmter Ereignisse im Seitenlebenszyklus gestartet werden. Wenn diese Ausnahme beim Ausführen einer Seite aufgetreten ist, stellen Sie sicher, dass die Seite als <% @ Page Async = "true"%> markiert ist. Diese Ausnahme kann auch auf einen Versuch hinweisen, eine "async void" -Methode aufzurufen, die in der ASP.NET-Anforderungsverarbeitung im Allgemeinen nicht unterstützt wird. Stattdessen sollte die asynchrone Methode eine Aufgabe zurückgeben, und der Aufrufer sollte darauf warten.

Ich habe versucht, zu machen Process synchron (I „async“ in Methodendefinition entfernt und verändert die alle Asynchron-Anrufe von await Method() zu Method().Result, aber es half nicht, die Server lädt nur die Seite für immer. Ich habe auch versucht zu ersetzen . IHttpHandler mit IHttpAsyncHandler, aber es hat nicht funktioniert ich habe auch versucht Handler-Datei im Stamm und im benutzerdefinierten Ordner zu verschieben, ist das Ergebnis die gleichen Bitte helfen

+1

Haben Sie darüber nachgedacht, nur einen Controller zu verwenden? Scheint einfacher für mich .. –

+0

Nein, weil es für mich einfacher zu sein schien, wollte ich die Lösung verwenden, die ich bereits habe (wohlgemerkt, es ist ein relativ großer Handler) – Dalibor

Antwort

0

können Sie versuchen, von der Methodendeklaration ändern.:

public async void ProcessRequest(HttpContext context) 

zu

public async Task ProcessRequest(HttpContext context) 
+0

'MyHandler' implementiert nicht Interface-Member 'IHttpHandler.ProcessRequest (HttpContext) '. 'MyHandler.ProcessRequest (HttpContext)' kann 'IHttpHandler.ProcessRequest (HttpContext)' nicht implementieren, da es nicht den passenden Rückgabetyp 'void' hat. – Dalibor

+0

Sie waren in der Nähe, siehe die obige Lösung. – Dalibor

+0

Ja. Die "override" ist eine andere Geschichte, weil der Compiler sowieso beschweren wird und das sollte eine einfache Lösung für Sie sein. Großartig, dass du es lösen konntest! – alltej

3

Versuchen Sie, die abstrakte HttpTaskAsyncHandler Klasse.

public class MyHandler : HttpTaskAsyncHandler 
{ 
    public override async Task ProcessRequestAsync(HttpContext context) 
    { 

    } 
} 
+0

Ja, ich habe es schon versucht, aber ich habe den Fehler "Nicht alle Codepfade geben den Wert zurück", weil ich "return" verwende. brechen. – Dalibor

+0

Ihre Lösung (fast) funktionierte, ich musste nur Methode zu * öffentliche Überschreibung async ändern Task ProcessRequestAsync * – Dalibor

+0

Ich bin froh, dass es für Sie ausgearbeitet hat, lassen Sie mich meine Antwort bearbeiten, damit andere Leute nicht verwirrt werden. –

0

Bisher habe ich es geschafft, es zu lösen durch Ashx regelmäßig Webformular (aspx) und platzieren Async = „true“ in der Page-Direktive umzusetzen. jedoch, wenn es noch Lösungen mit WebHandler sind, würde ich es vorziehen ...

EDIT: Immerhin teilweise die Lösung von Kerim Emurla vorgeschlagen gearbeitet, aber ich brauchte nur ein wenig zu ändern: public override Asynchron-Aufgabe ProcessRequestAsync