有趣的问题。如果我了解您的要求,您需要允许用户在后台生成报告时继续他们的业务,然后最终通过 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 以您认为合适的任何频率检查报告的缓存状态。