有趣的问题。如果我了解您的要求,您需要允许用户在后台生成报表的同时继续其业务,然后通过AJAX向用户发送通知,告知用户该报表已准备就绪。
我相信你正朝着正确的方向前进。我建议利用WCF异步回调。有关MSDN的优秀启动文章可以从here获得。回调事件处理程序应该使用在最初将报告请求发送到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。