3

ASP.NET MVC 4 Web API プロジェクトがあるとします。リソースの 1 つは、URL で呼び出すと、指定された時間パフォーマンス モニタリング データを取得するまで待機し、完了するとすべてのデータを JSON 形式で返します。ただし、URL を入力してからプロセスが完了するまでの間、動的にデータを返す方法はありますか。毎秒、パフォーマンス データが取得され、ブラウザに表示されます。

ここに問題があります: URL を介して API リソースを呼び出すことは、私が知る限り、そして誰もが知っているように見える限り、静的です。つまり、リソースがすべての情報を取得するまで JSON は表示されません。これは私が望んでいるものではありません。API リソースがデータを取得している間、ブラウザーで JSON を常に更新できるようにしたいと考えています。

私はリポジトリ クラスとコントローラ クラスで作業しているので、Javascript はオプションではありません。SignalR を使用してみましたが、特に Javascript を使用できないため、このシナリオでは機能しないようです。

API への URL 呼び出しでリアルタイム データを取得する方法はありますか?

適切な例: Google マップ。URL 経由で Google Maps API を呼び出す唯一の方法は、特定の場所の単一の画像を表示する「静的」マップが必要な場合です。いかなる種類の相互作用もありません。動的な「リアルタイム」マップが必要な場合は、Web アプリケーションを構築し、ビュー ページで Javascript を使用してアプリケーションで API リソースを使用する必要があります。URL経由で呼び出す方法はありません。

4

3 に答える 3

1

あなたが求めているのは、HTTP を介した一種のストリーミング メカニズムだと思います。もちろん、それを行うには、コンテンツの長さが不明な応答を送信する必要があります。

この質問は、おそらくソリューションの一部である、そのようなチャンク転送エンコーディングを扱います。クライアント側に何があるか分からないので、プッシュしたい JSON をどのように処理するかはわかりません。

素晴らしい質問です。

于 2012-09-02T22:21:53.723 に答える
1

必要に応じてすぐに、ブラウザーへの応答のストリーミングを開始できます。通常はバッファリングされますが、そうである必要はありません。私は過去にこのトリックを使用しました。実際、SignalR はいくつかの操作モードで同様のことを行いますが、HTTP はこれをサポートしていますが、デフォルトでは Web API コントローラーからは明らかではないことを追加する必要があります (今、質問を読み直しました)。Web メソッドから POCO を返すだけでなく、バ​​ッファをフラッシュできるように、応答処理を少し下げる必要があると思います。

基本的に、各情報を収集した後にバッファを書き込んでフラッシュする必要があるため、典型的なモデルではそれができないと思います。そのためには、カスタム メッセージ ハンドラーhttp://www.asp.net/web-api/overview/working-with-http/http-message-handlersがペイロードに到達する必要があると思います。

興味深いのですが、JSON を送り返したいとおっしゃっていますが、JavaScript は許可されていませんか?

于 2012-09-02T22:22:57.110 に答える
1

MVC コントローラーとルーティング パイプラインに関係なく、昔ながらの ASP.Net IHttpHandler 実装をまとめることができます。http://support.microsoft.com/kb/308001。その後、応答ストリームに完全にアクセスでき、必要に応じてバッファリングするかどうかを選択できます。ただし、ワーカー スレッドを長時間拘束するかどうかを検討する必要があります。多かれ少なかれ継続的にストリーミングすることを計画している場合は、レポからのさらなる応答を待つ間、間違いなく IAsyncHttpHandler を使用する必要があります。

そうは言っても、Web API は Async もサポートしていますが、もう少し洗練されています。いつでもデータを送り返すことを計画している場合は、最終的に JavaScript クライアント側を使用することを計画している場合は、これらすべてをすぐに実行できる SignalR をもう一度確認することを強くお勧めします。はるかに簡単です。

ただし、本当に Web API で Async を記述したい場合は、役立つリソースがいくつかあります。

http://blogs.msdn.com/b/henrikn/archive/2012/02/24/async-actions-in-asp-net-web-api.aspx

そして、これはまさにあなたが必要としているもののように見えます。 http://blogs.msdn.com/b/henrikn/archive/2012/04/23/using-cookies-with-asp-net-web-api.aspx

ただし、例でその PushStreamContent() クラスを使用するには、System.Net.Http.dll でそれが見つからないため、http://にある Web API スタックのナイトリー ビルドから取得する必要があります。 aspnetwebstack.codeplex.com/SourceControl/list/changesets

YMMV - がんばって!

于 2012-09-03T11:16:05.783 に答える