흥미로운 문제. 요구 사항을 이해하면 보고서가 백그라운드에서 생성되는 동안 사용자가 비즈니스에 대해 계속할 수있게 한 다음 최종적으로 보고서가 AJAX를 통해 준비되었다는 알림을 사용자에게 보냅니다.
나는 올바른 방향으로 가고 있다고 생각합니다. WCF 비동기 콜백을 활용하는 것이 좋습니다. MSDN에서 좋은 시작 문서는 here입니다. 콜백 이벤트 처리기는 보고서 요청이 처음 WCF 작업으로 전송 될 때 만들어진 고유 한 캐시 키를 사용하여 보고서의 캐시 된 상태를 설정해야합니다.
클라이언트 쪽 알림은 AJAX에서 사용하는 동일한 고유 한 캐시 키를 사용하여 보고서의 상태를 주기적으로 확인하는 보고서 상태 폴링 메커니즘을 사용하여 수행 할 수 있습니다.
이
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 구현은 사용이 적절 믿는 어떤 주파수에서 보고서의 캐시 된 상태를 확인할 수 있습니다 :
비동기 WCF 콜백의 간단한 예는 다음과 같은 일을 할 수있는 동일한 ReportStatusKey.