0

我有一个自托管服务,可以处理客户端通过 net.tcp 绑定提交的长时间运行的作业。当作业运行时(在 a 内Task),服务将通过单向回调将状态更新推送到客户端。这很好用,但是当我尝试调用另一个回调来通知客户端作业已完成(也是单向)时,永远不会在客户端上接收/调用回调。在这个过程中我没有收到任何异常。

我的回调合约如下所示:

public interface IWorkflowCallback
{

    [OperationContract(IsOneWay = true)]
    [ApplySharedTypeResolverAttribute]
    void UpdateStatus(WorkflowJobStatusUpdate StatusUpdate);

    [OperationContract(IsOneWay = true)]
    [ApplySharedTypeResolverAttribute]
    void NotifyJobCompleted(WorkflowJobCompletionNotice Notice);

}

调用回调的服务中的代码:(不在服务实现本身中,而是直接从服务实现中调用)

public WorkflowJobTicket AddToQueue(WorkflowJobRequest Request)
{
    if (this.workflowEngine.WorkerPoolFull)
    {
        throw new QueueFullException();
    }
    var user = ServiceUserManager.CurrentUser;
    var context = OperationContext.Current;
    var workerId = this.workflowEngine.RunWorkflowJob(user, Request, new Object[]{new DialogServiceExtension(context)});
    var workerjob = this.workflowEngine.FindJob(workerId);
    var ticket = new WorkflowJobTicket()
    {
        JobRequestId = Request.JobRequestId,
        JobTicketId = workerId
    };
    user.RegisterTicket<IWorkflowCallback>(ticket);
    workerjob.WorkflowJobCompleted += this.NotifyJobComplete;
    workerjob.Status.PropertyChanged += this.NotifyJobStatusUpdate;
    this.notifyQueueChanged();
    return ticket;
}
protected void NotifyJobStatusUpdate(object sender, PropertyChangedEventArgs e)
{
    var user = ServiceUserManager.GetInstance().GetUserWithTicket((sender as WorkflowJobStatus).JobId);
    Action<IWorkflowCallback> action = (callback) =>
    {
        ICommunicationObject communicationCallback = (ICommunicationObject)callback;
        if (communicationCallback.State == CommunicationState.Opened)
        {
            try
            {
                var updates = (sender as WorkflowJobStatus).GetUpdates();
                callback.UpdateStatus(updates);
            }
            catch (Exception)
            {
                communicationCallback.Abort();
            }
        }
    };
    user.Invoke<IWorkflowCallback>(action);
}
protected void NotifyJobComplete(WorkflowJob job, EventArgs e)
{
    var user = ServiceUserManager.GetInstance().GetUserWithTicket(job.JobId);
    Action<IWorkflowCallback> action = (callback) =>
    {
        ICommunicationObject communicationCallback = (ICommunicationObject)callback;
        if (communicationCallback.State == CommunicationState.Opened)
        {
            try
            {
                var notice = new WorkflowJobCompletionNotice()
                {
                    Ticket = user.GetTicket(job.JobId),
                    RuntimeOptions = job.RuntimeOptions
                };
                callback.NotifyJobCompleted(notice);
            }
            catch (Exception)
            {
                communicationCallback.Abort();
            }
        }
    };
    user.Invoke<IWorkflowCallback>(action);
}

在该user.Invoke<IWorkflowCallback>(action)方法中,Action通过 传递回调通道的实例OperationContext.GetCallbackChannel<IWorkflowCallback>()

我可以看到调用作业完成通知的任务是由服务执行的,但我没有在客户端收到调用。此外,在发送完成通知后,可以成功调用更新回调,因此不会出现通道正在悄悄发生故障。

知道为什么在这两个实现几乎相同的回调中,只有一个有效吗?

提前感谢您的任何见解。

4

0 回答 0