興味深い問題。要件を理解している場合は、レポートがバックグラウンドで生成されている間、ユーザーがビジネスを継続できるようにし、最後にAJAXを介してレポートの準備ができたことをユーザーに通知する必要があります。
あなたは正しい方向に向かっていると思います。私が提案するのは、WCF非同期コールバックを活用することです。MSDNの優れたスターター記事は、こちらから入手できます。コールバックイベントハンドラーは、レポート要求が最初にWCF操作に送信されたときに作成された一意のキャッシュキーを使用して、レポートのキャッシュステータスを設定する必要があります。
クライアント側の通知は、AJAXによって有効にされた同じ一意のキャッシュキーを使用してレポートのステータスを定期的にチェックするレポートステータスポーリングメカニズムを使用して実現できます。
非同期WCFコールバックの簡単な例では、次のようなことができます。
ReportServiceClient reportSvcClient = new ReportServiceClient();
Guid reportStatusKey = Guid.NewGuid();
reportSvcClient.GenerateReportCompleted += new EventHandler<GenerateReportCompletedEventArgs>(ReportStatusCallback);
reportSvcClient.GenerateReportAsync(reportStatusKey, <other operation paramters>);
// Set initial report status to False
// (recommend setting an appropriate expiration period)
Cache.Insert(reportStatusKey.ToString(), false);
// WCF callback static method which sets the report status in cache
static void ReportStatusCallback(object sender, GenerateReportCompletedEventArgs e)
{
Cache[e.ReportStatusKey.ToString()] = e.IsComplete;
}
...
public partial class GenerateReportCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
{
private object[] results;
public GenerateReportCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState)
{ this.results = results; }
public Guid ReportStatusKey
{
get {
base.RaiseExceptionIfNecessary();
return ((Guid)(this.results[0]));
}
}
public bool IsComplete
{
get {
base.RaiseExceptionIfNecessary();
return ((bool)(this.results[1]));
}
}
}
クライアント側のAJAX実装は、同じReportStatusKeyを使用して、適切と思われる頻度でレポートのキャッシュステータスを確認できます。