Бросить ошибку в поведение и вернуть ее клиенту - PullRequest
1 голос
/ 25 февраля 2011

Я пишу некоторые службы в 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 ]

0 голосов
/ 28 февраля 2011

Мне удалось заставить его работать.Я понял, что мой 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);
                }
            }
        }
0 голосов
/ 26 февраля 2011

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

Произошла некоторая ошибка, которая не обнаруживается на стороне сервера.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...