Бросить ошибку в поведение и вернуть ее клиенту

Я пишу некоторые службы в WCF для вызова клиентом Silverlight. Я изменяю код состояния на 200 каждый раз, когда должна быть возвращена ошибка, через IDispatchMessageInspector.

Он работает почти идеально, но иногда он возвращает ошибку 500: NotFound.

Я только что написал еще один IDispatchMessageInspector для фиксации изменений в ObjectContext. Но когда это не удается, обработчик ошибок не вызывается.

Я думаю, что к моменту запуска UnitOfWorkMessageInspector сообщение уже было настроено как ответ без ошибок. Как я могу сделать обе вещи работать?

    public class UnitOfWorkMessageInspector : IDispatchMessageInspector
    {
        public void BeforeSendReply(ref Message reply, object correlationState)
        {
            if (!reply.IsFault)
            {
                try
                {
                    UnitOfWorkBase.Commit();
                }
                catch (OptimisticConcurrencyException)
                {
                    throw new FaultException("It was changed by another user. Try again.");
                }
            }
        }

2 ответа

Решение

Мне удалось заставить это работать. Я понял, что мой IDispatchMessageInspector для переключения с кода состояния 500 на 200 не будет работать, потому что сообщение уже было создано, затем я заменил сообщение.

    public class UnitOfWorkMessageInspector : IDispatchMessageInspector
    {
        public void BeforeSendReply(ref Message reply, object correlationState)
        {
            if (!reply.IsFault)
            {
                try
                {
                    UnitOfWorkBase.Commit();
                }
                catch (OptimisticConcurrencyException)
                {
                    FaultException fe = new FaultException("It was changed by another user. Try again.");
                    reply = Message.CreateMessage(reply.Version, fe.CreateMessageFault(), fe.Action);
                }
            }
        }

Код 500 - Внутренняя Ошибка.

Возникает какая-то ошибка, и она не перехватывается на стороне сервера.

В вашем коде вы только перехватываете OptimisticConcurrencyException, вам нужно также перехватить Exception.

Другие вопросы по тегам