2016-04-27 21 views
0

WebFormsプロジェクトからMVCにカスタムWebハンドラを移行しようとしました。そこでは正常に動作し、非同期ProcessRequestと呼ばれました。MVCで非同期Webハンドラが動作しない

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

私は私のMVCプロジェクト(/Content/MyHandler.ashx)でそれを実行した場合しかし、私はエラーを以下の取得:

非同期操作は、この時点で開始することはできません。非同期操作は、非同期ハンドラまたはモジュール内、またはページライフサイクルの特定のイベント中にのみ開始できます。ページの実行中にこの例外が発生した場合は、Pageが<%@ Page Async = "true"%>とマークされていることを確認してください。この例外は、ASP.NET要求処理では一般的にサポートされていない「非同期void」メソッドの呼び出しを示す可能性があります。代わりに、非同期メソッドはTaskを返す必要があり、呼び出し元はそれを待つ必要があります。

私はのprocessRequestが同期作ってみました(私はメソッド定義では「非同期」を削除し、Method().Resultawait Method()から、すべての非同期呼び出しを変更しましたが、それは助けていない、サーバーだけで永遠にページをロードします。 私も交換してみましたIHttpAsyncHandlerIHttpHandlerが、それはうまくいきませんでした 私もルートに、カスタムフォルダにハンドラファイルを移動しようとした、結果は同じである 助けてください

+1

コントローラを使用していると考えたことはありますか? –

+0

いいえ、私にはもっと単純なように思えたので、私はすでに持っているソリューションを使いたいと思っていました。(これは比較的大きなハンドラです) – Dalibor

答えて

0

をあなたからメソッドの宣言を変更してみてください。。!:

public async void ProcessRequest(HttpContext context) 

public async Task ProcessRequest(HttpContext context) 
+0

'MyHandler'はIHttpHandler.ProcessRequest (HttpContext) 'を返します。 'MyHandler.ProcessRequest(HttpContext)'は、一致する戻り値の型が 'void'でないため、 'IHttpHandler.ProcessRequest(HttpContext)'を実装できません。 – Dalibor

+0

あなたは近くでした、上記の解決策を見てください。 – Dalibor

+0

はい。コンパイラはとにかく文句を言うので、 "オーバーライド"は別の話です。あなたはそれを解決することができた偉大な! – alltej

3

に抽象HttpTaskAsyncHandlerクラスを使用してみてください。

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

    } 
} 
+0

はい、私はそれを試しましたが、私は "戻り値を使用するため"壊す。 – Dalibor

+0

あなたのソリューションは(ほぼ)うまくいきました。メソッドをpublic override asyncに変更する必要がありました。Task ProcessRequestAsync * – Dalibor

+0

私はあなたのためにうまくいきました。私の答えを編集して他の人が混乱しないようにしています。 –

0

は、これまでのところ私は、通常のWebフォーム(ASPX)にASHXを変換し、Pageディレクティブで非同期=「true」を置くことによって、それを解決するために管理してきました。 しかしソリューションはwebhandlerに残っていた場合、私はそれを好むだろう...

EDIT:すべての後に 、Kerim Emurlaによって提案された部分的に解決策を働いたが、私はちょうど1つのビットを変更するために必要な:タスク非同期 公共オーバーライドをProcessRequestAsync

関連する問題