我(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 没有太大关系)。
谢谢,戴夫