我(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没有多大关系)。
谢谢,戴夫
答案 0 :(得分:1)
Progress<T>
并不适合在WCF中使用。它是专为UI应用程序设计的,可能会因您的主机而异常(例如,ASP.NET与自托管)。
我建议您编写一个简单的IProgress<T>
实现,直接调用IAnalysisSubscriber.ReportProgress
。另外,请确保IAnalysisSubscriber.ReportProgress
OperationContract.IsOneWay
设置为true
。