0

我有我的网络应用程序,可以构建报告。mvc3 上的 Web 应用程序。构建器是 WCF 服务。
我使用线程池使我的报告自动生成。
基本模型如下所示:
-- Web 应用程序在报告生成时发送请求。
-- WCF 服务创建工作线程并向服务接受工作的 Web 应用程序发送响应。
-- Web 应用程序继续工作。

我需要什么:当 WCF 工作线程完成工作时,我需要通知Web 应用程序工作已完成。

那么如何用我的网络应用程序捕获该回调。(我使用 mvc 3)

你能建议最简单的方法来实现这个逻辑吗?

4

5 回答 5

0

这可以帮助您: 带有来自后台线程的回调的 WCF 服务?

如果还不够,您必须向您的 web 应用程序实施推送通知。

于 2012-10-03T23:57:08.817 回答
0

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

于 2012-09-29T05:08:38.160 回答
0

为什么不使用 svcutil /async 为您的 wcf 服务生成异步代理。这样,您的服务中就不需要自己的工作线程,客户端只需注册回调即可。

于 2012-10-02T15:02:44.977 回答
0

WCF 包含一个叫做Completion Callbacks的东西。在这里,您的客户端有一个方法,它仅在异步操作完成后才要求 WCF 为您调用。

例如:

public class MyClient : IDisposable
{
    BuilderClient _proxy = new BuilderClient();

    public void CallAsync(object input)
    {
        _proxy.BeginBuildReport(input, Oncompletion, null);
    }

    void OnCompletion(IAsyncResult result)
    {
        object output = _proxy.EndBuildReport(result);
        //Do whatever you want with your output here.
    }

    public void Dispose()
    {
        _proxy.Close();
    }
}

这将允许您使用简单的事件驱动模型。

于 2012-10-04T09:11:27.850 回答
0

有一些方法可以使用 Comet 或 Reverse-Ajax。之前已经回答了这个问题: 有什么方法可以将数据从 Web 服务器推送到浏览器?

于 2012-09-27T02:07:48.387 回答