2017-01-13 13 views
0

プロセスの進行状況を更新する方法を提供するリクエスト間にデータを格納しようとしています。私はこれを行うには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キーを使用できるようにします。

なぜこのようなことが起こり、どのように解決できますか?

+0

1.これは初めてセッションに書き込み/読み取りを行うときにのみ発生しますか?読んでください:あなたはそれを繰り返すとき、それは動作しますか?この場合、最初のメソッドはセッションを識別するクッキーを設定できないため、2つ目のリクエストはクッキーを使用せずにエンドポイントを呼び出し、セッションにアクセスすることはできません。 2. WebAPI-esque APIで状態(セッションまたはその他の情報)を使用しないでください。これはRESTful APIの原則に違反し、複数のインスタンスに拡張しようとすると問題が発生します。すべてのリクエストは以前のリクエストとは独立していて、リクエストで必要なすべてのデータを渡す必要があります。 – Tseng

+0

@Tsengこれは、セッションにデータを書き込んでから、コントローラメソッドが返される前に試してみると発生します。これは、メソッドが実行されるまで、セッションへの変更が「適用」されていないかのようです。これは、単一ページアプリケーション用の内部APIです.RESTfulガイドラインに従う必要はありません。この方法でURL構造をフォーマットすると便利です。 –

+1

セッションはライブに保存されず、リクエストの最後に保存されます。それはあなたが早くそれを保存するために呼び出すことができるコミットメソッドを持っています。 – Tratcher

答えて

-1

私の経験から、 'for'ループはファイルの値を書き込んだり、それが完了するまで繰り返します。したがって、代わりに関数を呼び出すことをお勧めします。値を渡して、検索のためにセッション文字列を保存します。

public void StoreSessionProgress(string progress) 
{ 
HttpContext.Session.SetString("progress", progress); 
} 

[HttpGet] 
[Route("/getTest")] 
public string GetTest() 
{ 
List<Stuff> largeCollection = GetLargeCollection(); 
for(int i = 0; i < largeCollection.Count; i++) 
{ 
    //Do stuff 
    StoreSessionProgress(i + "/" + largeCollection.Count) 
} 
return "done"; 
} 

[HttpGet] 
[Route("/getTest/progress")] 
public string GetProgress() 
{ 
return HttpContext.Session.GetString("progress"); 
} 
+0

これは質問に答えるつもりではありませんが、これはコードの品質に重点を置いています。問題のためにこの例を作ったと考えても問題ありません。これはまったく同じ効果があります。 –

関連する問題