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