调用WCF RIA异常操作中断Caliburn.Micro协程执行?

时间:2011-03-03 02:29:58

标签: wcf-ria-services caliburn.micro

我正在通过yield从Caliburn.Micro动作消息调用的IEnumerable方法返回它们来执行一系列Caliburn.Micro IResults。第一个IResult调用WCF RIA服务Invoke操作。有时此操作会失败并引发异常。这是在IResult中处理的,其中检查InvokeOperation对象是否有错误,我将错误标记为已处理并将IResult的错误消息字段设置为错误,以便我可以从客户端恢复它。

问题在于,由于某种原因,这会中断协同例程的执行。我想不出任何正当理由,但是当我处于调试模式时,VS会跳到服务器代码并调出未处理的异常帮助器,告诉我有一个未捕获的异常(duh),并且协同例程永远不会继续执行IEnumerable的其他成员。

以下是一些代码。

来自行动讯息:

    public IEnumerable<IResult> Submit()
    {
        var register = new RegisterUserResult(Username, Password, Email, _userModel);
        yield return register;

        if (register.Success)
        {
            if (RegisterAsTrainer) 
                yield return new ApplyRoleToUserResult(Username, "Trainer", _userModel);
            yield return new NavigateResult(new Uri("/MainPageViewModel", UriKind.Relative));
        }
        else ErrorMessage = register.ErrorMessage;
    }

DomainService中的代码(有时会引发异常)

    [Invoke]
    public void CreateUser(string username, string password, string email)
    {
        Membership.CreateUser(username, password, email);
    }

...其中Membership是ASP.NET类,我用它来进行成员资格管理。

调用上述服务的IResult(为清楚起见,省略了一些细节):

    public void Execute(ActionExecutionContext context)
    {
        ErrorMessage = null;
        Success = false;

        var ctx = new TrainingContext();
        ctx.CreateUser(_username, _password, _email, CreateUserCallback, null);
    }

    private void CreateUserCallback(InvokeOperation invokeOp)
    {
        if (invokeOp.HasError)
            invokeOp.MarkErrorAsHandled();

        Completed(this, new ResultCompletionEventArgs
            {
                Error = invokeOp.Error,WasCancelled = invokeOp.IsCanceled
            });
    }

IResult.Completed DOES 触发,但该方法的其余部分永远不会执行。我真的是用这个撕掉我的头发,请帮助我。

1 个答案:

答案 0 :(得分:2)

是的,我想出来了,愚蠢的我。我正在设置IResult Error字段,以为我以后需要使用该信息。我不知道有一个非空的错误字段会导致协同例程执行停止(我以为只有Canceled字段会这样做)。我会留下这个,以防其他人遇到这个问题。