プロセスの進行状況を更新する方法を提供するリクエスト間にデータを格納しようとしています。私はこれを行うにはHttpContext.Session
オブジェクトを使用しようとしています。私は/getTest
を呼び出す場合は、長時間実行されるプロセスを開始し、進捗状況とprogress
キーを更新現在のリクエストが返されない場合、セッションキーの値はnullです。
[HttpGet]
[Route("/getTest")]
public string GetTest()
{
List<Stuff> largeCollection = GetLargeCollection();
for(int i = 0; i < largeCollection.Count; i++)
{
//Do stuff
HttpContext.Session.SetString("progress", i + "/" + largeCollection.Count); // ie. 1/1000
}
return "done";
}
[HttpGet]
[Route("/getTest/progress")]
public string GetProgress()
{
return HttpContext.Session.GetString("progress");
}
:
は、ここでは、2つの例のエンドポイント(構文の問題を無視し、これらが構成されています)です。この時間中に/getTest/progress
を呼び出した場合、GetString
メソッドから返される文字列はnullです。長期実行プロセスが完了した後に進捗エンドポイントを呼び出すと、返される文字列が進捗状況になります。
長時間実行中のプロセスが返されていない場合や返されない場合でも、Session
キーを使用できるようにします。
なぜこのようなことが起こり、どのように解決できますか?
1.これは初めてセッションに書き込み/読み取りを行うときにのみ発生しますか?読んでください:あなたはそれを繰り返すとき、それは動作しますか?この場合、最初のメソッドはセッションを識別するクッキーを設定できないため、2つ目のリクエストはクッキーを使用せずにエンドポイントを呼び出し、セッションにアクセスすることはできません。 2. WebAPI-esque APIで状態(セッションまたはその他の情報)を使用しないでください。これはRESTful APIの原則に違反し、複数のインスタンスに拡張しようとすると問題が発生します。すべてのリクエストは以前のリクエストとは独立していて、リクエストで必要なすべてのデータを渡す必要があります。 – Tseng
@Tsengこれは、セッションにデータを書き込んでから、コントローラメソッドが返される前に試してみると発生します。これは、メソッドが実行されるまで、セッションへの変更が「適用」されていないかのようです。これは、単一ページアプリケーション用の内部APIです.RESTfulガイドラインに従う必要はありません。この方法でURL構造をフォーマットすると便利です。 –
セッションはライブに保存されず、リクエストの最後に保存されます。それはあなたが早くそれを保存するために呼び出すことができるコミットメソッドを持っています。 – Tratcher