不在客户端上调用回调

时间:2013-03-20 05:34:26

标签: wcf

我有一个自托管服务,可以处理客户端通过net.tcp绑定提交的长时间运行的作业。当作业正在运行时(在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>()传递回调频道的实例。

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

任何想法为什么,在这两个几乎完全相同的回调中,只有一个有效?

提前感谢任何见解。

0 个答案:

没有答案