在WCF服务中使用TAP进度报告

时间:2013-04-29 19:44:58

标签: wcf reporting progress tap

我(WCF新手)正在编写一个获取和分析X射线光谱的WCF服务 - 即它是一个长时间运行的过程,有时是几分钟。当然,这需要异步调用,因此,使用wsDualHttpBinding并在我的ServiceContract中定义以下内容

   [ServiceContract(Namespace="--removed--",
    SessionMode=SessionMode.Required, CallbackContract=typeof(IAnalysisSubscriber))]
public interface IAnalysisController 
{
    // Simplified - removed other declarations for clarity
    [OperationContract]
    Task<Measurement> StartMeasurement(MeasurementRequest request);
}

(简化)实施

    async public Task<Measurement> StartMeasurement(MeasurementRequest request)
    {
        m_meas = m_config.GetMeasurement(request);
        Spectrum sp = await m_mca.Acquire(m_meas.AcquisitionTime, null);
        UpdateSpectrum(m_meas, sp);
        return m_meas;
    }


private void McaProgress(Spectrum sp)
{
   m_client.ReportProgress(sp);
}

其中m_client是从m_client = OperationContext.Current.GetCallbackChannel()获得的回调对象;在“Connect”方法中 - 在WCF客户端首次连接时调用。只要我不使用进度报告,只要我通过在第一个进度报告中将m_mca.Acquire()方法中的“null”更改为“new Progress(McaProgress)”来添加进度报告,客户端生成错误“服务器未提供有意义的回复;这可能是由合同不匹配引起的......”

我理解客户端可能正在等待任务的特定回复,而不是在其中进行回调,但是如何使用WCF实现此类进度报告?我希望客户能够在生成时看到实时频谱,并估算完成频谱采集的剩余时间。任何帮助或指向某人使用WCF实现此类进度报告的位置都非常感谢(我一直在搜索,但主要找到对EAP或APM和WCF的引用,与TAP没有多大关系)。

谢谢,戴夫

1 个答案:

答案 0 :(得分:1)

Progress<T>并不适合在WCF中使用。它是专为UI应用程序设计的,可能会因您的主机而异常(例如,ASP.NET与自托管)。

我建议您编写一个简单的IProgress<T>实现,直接调用IAnalysisSubscriber.ReportProgress。另外,请确保IAnalysisSubscriber.ReportProgress OperationContract.IsOneWay设置为true