Исключение WCF RIA при вызове Invoke прерывает выполнение Caliburn.Micro сопрограммы? - PullRequest
1 голос
/ 03 марта 2011

Я выполняю серию Caliburn.Micro IResults, возвращая их из метода IEnumerable, вызываемого сообщением действия Caliburn.Micro.Первый IResult вызывает операцию вызова службы WCF RIA.Иногда эта операция завершается неудачно и выдает исключение.Это обрабатывается в IResult, где объект InvokeOperation проверяется на наличие ошибок, я отмечаю ошибку как обработанную и устанавливаю в поле сообщения об ошибке IResult значение ошибки, чтобы я мог восстановить его с клиента.

Проблема заключается в том, чтопо какой-то причине это прерывает выполнение подпрограммы.Я не могу придумать вескую причину, почему, но когда я нахожусь в режиме отладки, VS переходит к server code и вызывает помощника необработанного исключения, сообщающего мне, что было необработанное исключение (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 Ответ

2 голосов
/ 03 марта 2011

Тьфу, я понял это, глупый я. Я устанавливал поле «Ошибка IResult», думая, что мне понадобится использовать эту информацию позже. Я не знал, что наличие ненулевого поля Error приведет к остановке выполнения подпрограммы (я думал, что только поле Cancelled сделает это). Я оставлю это здесь на случай, если кто-нибудь еще столкнется с этой проблемой.

...