0

我(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() 获得的回调对象;在“连接”方法中 - 在 WCF 客户端首次连接时调用。只要我不使用进度报告,这就会起作用,但是只要我通过在第一个进度报告上将 m_mca.Acquire() 方法中的“null”更改为“new Progress(McaProgress)”来添加进度报告,客户端生成错误“服务器没有提供有意义的回复;这可能是由合同不匹配引起的......”

我了解客户端可能正在等待任务的特定回复,而不是对其进行回调,但是如何使用 WCF 实现这种类型的进度报告?我希望客户能够看到生成的实时频谱,并估计完成频谱采集所需的剩余时间。非常感谢有人在哪里使用 WCF 实现了这种类型的进度报告的任何帮助或指针(我一直在搜索,但发现主要是对 EAP 或 APM 和 WCF 的引用,与 TAP 没有太大关系)。

谢谢,戴夫

4

1 回答 1

1

Progress<T>并不是真的要在 WCF 中使用。它是为 UI 应用程序设计的,根据您的主机(例如,ASP.NET 与自托管),它的行为可能会很奇怪。

我建议编写一个直接IProgress<T>调用的简单实现IAnalysisSubscriber.ReportProgress。还要确保IAnalysisSubscriber.ReportProgressOperationContract.IsOneWay设置为true

于 2013-04-29T20:31:14.990 回答