問題タブ [ihttpasynchandler]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - IHttpAsyncHandler を介した BLOB の読み取り
SQL Server 2000 データベース (BLOB タイプ) に画像を保存しています。私の ASP.NET アプリケーションには、エンド ユーザーに多くの画像を表示する必要がある Web ページがあり、IHttpAsyncHandler を介してブラウザーの画像要求を処理したいと考えています。codeproject で同様の投稿を見つけました「Asynchronous BLOB DataReader の非同期 HTTP ハンドラー」。 しかし、何らかの理由で、「BeginProcessRequest」メソッドの完了時にページがフリーズし、「EndProcessRequest」メソッドが呼び出されません。誰でもこの投稿を見て、その投稿の何が問題なのか教えてもらえますか? または、このタスクを完了するために何をする必要がありますか (IHttpAsyncHandler を介した BLOB の読み取り)?
この投稿のソース コードは次のとおりです。
c# - IHttpAsyncHandlerおよびIObservableWebリクエスト
非同期ハンドラー内で、リダイレクト文字列を返すWebrequestからIObservableを作成しています。
私はそのobservableをサブスクライブし、AsyncResult.CompleteCall()を呼び出していますが、それを実行するためにThread.Sleep(100)を使用する必要があります。そして、それは毎回機能するわけではありません。これは正しくないと確信しています。光を当てていただけませんか。ありがとうございました!
asp.net - IHttpAsyncHandlerがIHttpHandlerを介して呼び出されるのはなぜですか?
MvcHandlerから派生したカスタムハンドラーを作成しました。GetHttpHandler()の新しいハンドラーを返すカスタムRouteHandlerを使用するルートがあり、カスタムハンドラーでProcessRequest()をオーバーライドします。GetHttpHandlerの呼び出しはブレークポイントをトリガーし、ハンドラーのコンストラクターは確実に呼び出されますが、BeginProcessRequest()はProcessRequest()ではなくベースMvcHandlerで呼び出されます。
何もしていないのに非同期メソッドが呼び出されるのはなぜですか?私は非同期処理を望んでいません、そして私は確かにそれを得るために明示的なことは何もしませんでした。私のコントローラーはすべて、AsyncControllerではなくControllerから派生しています。
現在、ソースコードを持っていませんが、必要に応じて後で追加できます。私は、BeginProcessRequestが不要なときに呼び出される理由のいくつかを誰かが知っていることを望んでいました。
.net - IHttpAsyncHandlerが負荷時にメモリをリークするのはなぜですか?
.NET IHttpAsyncHandler(および程度は低いですがIHttpHandler)が、同時Web要求にさらされると、メモリをリークすることに気づきました。
私のテストでは、Visual Studio Webサーバー(Cassini)が6MBのメモリから100MBを超えるメモリにジャンプし、テストが終了すると、再利用されることはありません。
問題は簡単に再現できます。2つのプロジェクトで新しいソリューション(LeakyHandler)を作成します。
- ASP.NET Webアプリケーション(LeakyHandler.WebApp)
- コンソールアプリケーション(LeakyHandler.ConsoleApp)
LeakyHandler.WebAppの場合:
- IHttpAsyncHandlerを実装するTestHandlerというクラスを作成します。
- リクエスト処理で、短いスリープを実行し、応答を終了します。
- HTTPハンドラーをtest.ashxとしてWeb.configに追加します。
LeakyHandler.ConsoleAppの場合:
- test.ashxへの多数のHttpWebRequestを生成し、それらを非同期で実行します。
HttpWebRequests(sampleSize)の数が増えると、メモリリークがますます明らかになります。
LeakyHandler.WebApp> TestHandler.cs
LeakyHandler.WebApp> Web.config
LeakyHandler.ConsoleApp> Program.cs
デバッグの更新
WinDbgを使用してダンプファイルを調べましたが、いくつかの疑わしいタイプがメモリに保持されており、解放されていません。10,000のサンプルサイズでテストを実行するたびに、これらのオブジェクトがさらに10,000個メモリに保持されることになります。
System.Runtime.Remoting.ServerIdentity
System.Runtime.Remoting.ObjRef
Microsoft.VisualStudio.WebHost.Connection
System.Runtime.Remoting.Messaging.StackBuilderSink
System.Runtime.Remoting.ChannelInfo
System.Runtime.Remoting.Messaging.ServerObjectTerminatorSink
これらのオブジェクトは第2世代のヒープにあり、強制的に完全なガベージコレクションを実行した後でも収集されません。
重要な注意点
この問題は、シーケンシャルリクエストを強制する場合でも存在し、Thread.Sleep(10)
inがなくてもProcessRequest
、はるかに微妙です。この例は、問題をより簡単に明らかにすることで問題を悪化させますが、基本は同じです。
c# - AsynchResultオブジェクトを再構築することでプッシュテクノロジーをシミュレートする-それも可能ですか?
最近、HttpAsyncHandlerを使用してロングポーリングサービスを正常に作成しました。開発中に、繰り返し長いポーリングを行わなくても、AsyncResultオブジェクトを何度も再利用できる可能性があります。可能であれば、AsyncResultを何らかの方法で再構築または再利用することで、プッシュテクノロジーを「シミュレート」することができます(最初のリクエストをサブスクリプションリクエストであるかのように扱います)。
もちろん、最初の呼び出しはうまく機能しますが、その後の呼び出しでは「オブジェクトがオブジェクトのインスタンスに設定されていません」というメッセージが表示され続けます。私が「推測」しているのは、特定のオブジェクトが静的であるため、「完了」すると再利用または取得できないためです(洞察があれば素晴らしいです!)。
だから問題は…</p>
古いコールバックから新しいコールバックを動的に構築することは可能ですか?
最初の「サブスクリプション」プロセスは次のようになります。
サービスの機能の例を次に示します。
AsyncResult.ProcessRequest()呼び出しの例を次に示します。
だから...このような何かが可能でしょうか?
私は文字通りこれを試しましたが、うまくいきませんでした...しかし、何かが「好き」なことは可能ですか?
asp.net-mvc - ASP.NET MVC 2 でファイルをアップロードする最良の方法は何ですか?
可変サイズのファイル (非常に大きいまたは非常に小さい) を ASP.NET MVC 2 アプリケーション ファイル システムにアップロードするための最良の方法は何ですか?
これは私がこれまでに理解していることです:
人々がこれを処理する方法は2つあるようです。(ファイルが非常に大きいか非常に小さいと仮定しましょう)
Request.Files
(1)またはを介してコントローラ アクションでアップロードを処理しHttpPostedFileBase
ます。これには、ASP.NET がファイルをアクティブ メモリにロードするため、時間がかかるという欠点があるようです。
また
(2) 何らかの方法でパフォーマンスの問題を回避する HttpModule を使用して、早い段階でファイルのアップロードを傍受します。(これがどのように機能するかについては少し曇っていますが、この投稿を使用しています http://darrenjohnstone.net/2008/07/15/aspnet-file-upload-module-version-2-beta-1/参考までに)。 私が曖昧な部分は、ASP.NET が送信されたファイルをアクティブなメモリにロードする時点と、モジュールでこれをインターセプトすると実際にこの動作がどのように変化するかです。
2 番目のオプションの方が高速であるため、より適切なオプションのように思えます。しかし、アップロード フォームを送信するアプリケーションには、データベースに保持する必要があるファイルに関連付けられたデータが含まれている可能性が高いようです。HttpHandler または HttpModule で永続呼び出しを行いたくありません (コントローラーと http ハンドラーの 2 つの非常によく似た機能が異なる場所で発生するため)。
回避策の1 つは、ターゲット ファイルの場所を HttpContext.Items に格納することだと思いますが、これが最善の方法ですか?
これに関する最後の懸念事項は、ファイルのアップロードが完了する前に HttpResponse をレンダリングしたいということです。そのため、大きなファイルがある場合は、ユーザーにアップロード ステータスの値を含むビューを送信し、AJAX 呼び出しを行ってステータスを更新します。 アップロード プロセスを続行しながら結果をレンダリングするにはどうすればよいですか? AsyncHandler または AsyncController を作成する必要がありますか? 別のスレッドを手動で取得する必要がありますか?
どうもありがとう。私はこれが多くの質問であることを知っており、おそらく何かについての一般的な理解の欠如を反映しています. 一般的な理解不足の面白いところは、それらを持っている人は、自分に欠けている理解も理解していない傾向があるということです. .
asp.net - 非同期Httpハンドラー
SQLiteで一括挿入を行うASHXがあります。このページは2秒間読み込まれます+/-
I / O作業中にASP.NETスレッドを保持しないように、非同期Httpハンドラーを使用して実装することをお勧めします。
IHttpHandlerをIHttpAsyncHandlerに変えるために、これを実行しました。正しいですか?
-ASHXで実装するインターフェイスをIHttpAsyncHandlerに変更しました
-この変数とコンストラクターを追加します。
-2つのIHttpAsyncHandlerメソッドを実装しました:
私の主な疑問は、元のProcessRequestを維持し、それをアクションで呼び出す必要があるかどうかです。また、ProcessRequest内でcontext.Responseを使用しても問題がない場合、またはこの作業はEndProcessRequestで実行する必要があります
asp.net - asp.netの.csvファイルを扱う非同期httpハンドラ
私は、ロング ポーリング アプローチに基づくライブ スコアリング アプリケーションを開発しました。これは、コメットとも呼ばれます。IIS 6 で動作する ASP.NET 4.0 を使用しました (windows 2003 - CPU が 2 つしかないため、プール内のスレッドの可用性についてはあまり役に立ちません)。
データは.csv
、Web サーバーのソース フォルダーに貼り付けられたファイルの形式で入ってきます。これを Microsoft JET 4.0 OleDb プロバイダーを使用してインポートし、アプリケーションの部分に応じてさまざまな方法を使用して表示します。
ロング ポーリング部分のエンジンIHttpAsyncHandler.
は、ライブ スコアリング アプリケーションであるため、ユーザーは Web サイトにアクセスし、現在のデータを含む通常の応答を取得し、ボディ ロードで jquery ajax を介して非同期 http ハンドラーに新しい要求を送信します。
次に、このハンドラーは要求をキューに格納し、(通常は) スレッドをスレッド プールに戻します。これが発生したら、手動リセット イベントを作成して操作を保留します。その間、ファイル システム ウォッチャー オブジェクトが作成されて送信され、csv データ ソース フォルダー内の変更が検出されます。
イベントが発生したらonChange
、手動リセット イベントを設定します。非同期操作は、新しく更新された csv ファイルを取得して再開し、クライアントに新しいデータで応答することが許可されます。
常にエラーが発生していない場合、これはすべて素晴らしいことです。一般的に、非常に一般的な方法で、アプリケーションは機能していますが、特定できない問題があります。
つまり、csv ファイルをサーバーに取り込むプロセス (スポーツ会場からの ftp 転送) によって csv ファイルがロックされている可能性があるため、csv ファイルへのアクセスに問題があるかどうかはわかりません。それとも、私の (乱用) の使用なのIHttpAsyncHandler
か、それとも CPU とスレッドが不足しているだけなのか (毎日約 3000 のユニークな訪問者しかいないため、信じがたいと思います。私はそうではありません)時間ごとの数字を知っている)。
2 つの CPU を搭載した IIS 6 Windows 2003 がこの種のアプリケーションをサポートできない可能性はありますか?
ここに私が得続けるエラーがあります:
イベントの種類: エラー イベント ソース: ASP.NET 4.0.30319.0 イベント カテゴリ: なし イベント ID: 1325 日付: 20/04/2011 時刻: 15:33:14 ユーザー: N/A コンピューター: xxx 説明: 未処理の例外が発生し、プロセスは終了しました。
アプリケーション ID: /LM/W3SVC/1/ROOT プロセス ID: 5264 例外: System.Data.OleDb.OleDbException メッセージ: 不明なエラー
スタック トレース: System.Data.OleDb.OleDbConnectionInternal..ctor (OleDbConnectionString コンストラクター、OleDbConnection 接続) で
System.Data.OleDb.OleDbConnectionFactory.CreateConnection (DbConnectionOptions オプション、オブジェクト poolGroupProviderInfo、DbConnectionPool プール、DbConnection owningObject) で System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection (DbConnection owningConnection、DbConnectionPoolGroup プール グループ) で System.Data.ProviderBase.DbConnectionFactory.GetConnection (DbConnection owningConnection) で System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) で System.Data.OleDb.OleDbConnection.Open() で Broker.brCSV.readCSV(String fileName) で SwatchTiming.AsynchOperation.StartAsyncTask(オブジェクト workItemState) System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(オブジェクト状態) で System.Threading.System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode コード、CleanupCode backoutCode、オブジェクト userData) での ExecutionContext.runTryCode (オブジェクト userData) System.Threading.ExecutionContext.RunInternal (ExecutionContext executionContext、ContextCallback コールバック、オブジェクト状態) で System.Threading。 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() での ExecutionContext.Run (ExecutionContext executionContext、ContextCallback コールバック、オブジェクト状態、ブール値の ignoreSyncCtx) System.Threading.ThreadPoolWorkQueue.Dispatch() で System.Threading._ThreadPoolWaitCallback.PerformWaitCallback ()System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback コールバック、オブジェクト状態) で System.Threading.ExecutionContext.Run(ExecutionContext 実行コンテキスト、ContextCallback コールバック、オブジェクト状態、ブール値の ignoreSyncCtx) で System.Threading.Threading で。 QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() System.Threading.ThreadPoolWorkQueue.Dispatch() で System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback コールバック、オブジェクト状態) で System.Threading.ExecutionContext.Run(ExecutionContext 実行コンテキスト、ContextCallback コールバック、オブジェクト状態、ブール値の ignoreSyncCtx) で System.Threading.Threading で。 QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() System.Threading.ThreadPoolWorkQueue.Dispatch() で System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() のブール値 ignoreSyncCtx) System.Threading.ThreadPoolWorkQueue.Dispatch() の System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() のブール値 ignoreSyncCtx) System.Threading.ThreadPoolWorkQueue.Dispatch() の System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
また:
イベントの種類: エラーイベント ソース: .NET ランタイム 4.0 エラー報告イベント カテゴリ: なしイベント ID: 5000 日付: 20/04/2011 時刻: 15:33:14 ユーザー: N/Aコンピューター: xxx 説明:EventType clr20r3、P1 w3wp。 exe、P2 6.0.3790.3959、P3 45d6968e、P4 system.data、P5 4.0.0.0、P6 4ba1e064、P7 1ea3、P8 87、P9 system.data.oledb.oledbexception、P10 NIL。詳細については、 http : //go.microsoft.com/fwlink/events.asp
のヘルプとサポート センターを参照してください 。 0.r.3.,.0010: 20 00 77 00 33 00 77 00 .w.3.w.0018: 70 00 2e 00 65 00 78 00
p...ex0020: 65 00 2c 00 20 00 36 00 e.,. .6.0028: 2e 00 30 00 2e 00 33 00 ..0...3.0030: 37 00 39 00 30 00 2e 00 7.9.0...0038: 33 00 39 00 35 00 39 00 3.9.5.9.0040: 2c 00 20 00 34 00 35 00 ,. .4.5.0048: 64 00 36 00 39 00 36 00 d.6.9.6.0050: 38 00 65 00 2c 00 20 00 8.e. .0058: 73 00 79 00 73 00 74 00 syst0060: 65 00 6d 00 2e 00 64 00 em..d.0068: 61 00 74 00 61 00 2c 00 ata、.0070: 20 00 34 00 2e 00 . 3 4...0.0078: 2e 00 30 00 2e 00 30 00
..0...0.0080: 2c 00 20 00 34 00 62 00 ,. .4.b.0088: 61 00 31 00 65 00 30 00 a.1.e.0.0090: 36 00 34 00 2c 00 20 00 6.4.,. .0098: 31 00 65 00 61 00 33 00 1.ea3.00a0: 2c 00 20 00 38 00 37 00 ,. .8.7.00a8: 2c 00 20 00 73 00 79 00 ,. .sy00b0: 73 00 74 00 65 00 6d 00 stem00b8: 2e 00 64 00 61 00 74 00 ..dat00c0: 61 00 2e 00 6f 00 6c 00 a...ol00c8: 65 00 64 00 62 00 ed b. 0 00d0: 6f 00 6c 00 65 00 64 00 oled00d8: 62 00 65 00 78 00 63 00 bexc00e0: 65 00 70 00 74 00 69 00 epti00e8: 6f 00 6e 000 20 00 4e 00: N 0.4e 00 0d 00 0a 00 イル....
と...
イベントの種類: エラー イベント ソース: .NET ランタイム イベント カテゴリ: なし イベント ID: 1026 日付: 2011/04/20 時刻: 15:34:26 ユーザー: 該当なし コンピューター: xxx 説明: アプリケーション: w3wp.exe フレームワークのバージョン: v4.0.30319 説明: 未処理の例外が原因でプロセスが終了しました。例外情報: System.Data.OleDb.OleDbException
スタック: System.Data.ProviderBase.DbConnectionClosed.OpenConnection(System.Data.Common.DbConnection, System.Data.ProviderBase.DbConnectionFactory) で System.Data.OleDb.OleDbConnection.Open() で Broker.brCSV.readCSV(System.文字列) で [ProjectNamespace].AsynchOperation.StartAsyncTask(System.Object) で System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object) で System.Threading.ExecutionContext.runTryCode(System.Object) で System.Runtime.CompilerServices.RuntimeHelpers. System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) での ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object) System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback、System.Object、Boolean) System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() で System.Threading.ThreadPoolWorkQueue.Dispatch() で System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
最後にもう少し情報を。IIS 6 を微調整しようとしましたが、あまり役に立たないようです。
では一体何が起こっているのか、なぜ私のサイトが 5 分ごとにクラッシュするのか、わかる人はいますか?
編集:これがハンドラーの私のコードです。これが役立つことを願っています
はBeginProcessRequest
次のとおりです(それ以外は、IsReusable
false に設定しているだけです):
そして、AsynchOperation
実装するクラスIAsyncResult
:
編集 #2: Broker.brCSV.readCSV(fileName) のコード
接続文字列の末尾、特にMode
パラメーターを確認してください。msdn は、これがファイル アクセス許可を指定する方法であると述べていますが、指示を正しい方法で解釈しなかった可能性があります...つまり、mode=3
ファイル アクセスを読み取り/書き込みとして指定することになっていますが、私はそうではありませんそれが動作するかどうかを確認してください。
編集 #3: 新しい Broker.brCSV.readCSV() は InvalidOperationException をスローします
親切なヘルパー Smudge202 の提案に従って、Broker.brCSV.readCSV メソッドのコードを次のように変更しました。
ただし、このコードをテストすると、次のエラーが発生しました。
イベントの種類: エラー イベント ソース: ASP.NET 4.0.30319.0 イベント カテゴリ: なし イベント ID: 1325 日付: 22/04/2011 時刻: 08:46:33 ユーザー: N/A コンピューター: EUW0002184 説明: 未処理の例外が発生し、プロセスは終了しました。
アプリケーション ID: /LM/W3SVC/1/ROOT
プロセス ID: 6408
例外: System.InvalidOperationException
メッセージ: リーダーが閉じているときに Read を呼び出す試みは無効です。
StackTrace: System.Data.OleDb.OleDbDataReader.Read() で SwatchTiming.AsynchOperation.StartAsyncTask(オブジェクト workItemState) で System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(オブジェクト状態) で System.Threading.ExecutionContext.runTryCode(オブジェクト userData) で System. .Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode コード、CleanupCode backoutCode、オブジェクト userData) System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback コールバック、オブジェクト状態) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback コールバック) 、オブジェクトの状態、ブール値の ignoreSyncCtx) (System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() で System.Threading.ThreadPoolWorkQueue で)。System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() で Dispatch()
としても:
イベントの種類: エラー イベント ソース: .NET ランタイム イベント カテゴリ: なし イベント ID: 1026 日付: 2011/04/22 時刻: 08:47:53 ユーザー: 該当なし コンピューター: EUW0002184 説明: アプリケーション: w3wp.exe フレームワークのバージョン: v4.0.30319 説明: 未処理の例外が発生したため、プロセスが終了しました。例外情報: System.InvalidOperationException スタック: System.Data.OleDb.OleDbDataReader.Read() で SwatchTiming.AsynchOperation.StartAsyncTask(System.Object) で System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object) で System.Threading.ExecutionContext .runTryCode(System.Object) で System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object) で System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.
そのため、ハンドラーが新しい readCSV メソッドを使用しようとすると、これらのエラーが発生します...さらに提案はありますか? :) Smudge さん、ありがとうございました。
c# - IHttpAsyncHandlerを設定する方法は?
非同期HttpHandlerをセットアップしようとしていますが、正しい方向に進んでいるかどうかわかりません。それに関するドキュメントはあまりないようです。DoWork()メソッドを非同期で起動するリクエストを取得したいだけです。
よくわからないことがいくつかあります。
asp.net - ランタイムによる IHttpAsyncHandler インスタンスの使用
IHttpAsyncHandler インスタンス A が与えられた場合、A は EndProcessRequest コールバックを受け取るインスタンスになりますか? もしそうなら、それは保証されていますか?IsReusable プロパティは動作をまったく変更しますか?
私が手を差し伸べて、他の誰かがすでにこの道を進んでいるかどうかを確認したかったことをテストしようとするのは十分に複雑です.
現在、EndProcessRequest に送信される状態オブジェクトを使用する IHttpAsyncHandler があり、すべてが完全に機能しています。ただし、プロパティやフィールドなどのインスタンス レベルの変数で状態を保持できれば、コードを大幅にきれいにすることができます。
考え?