Итак, я отправился на охоту через декомпилированный код RIA Services. Не похоже, что можно существенно изменить информацию об ошибке, отправляемую клиенту.
Вы можете переопределить метод OnError()
в вашем DomainService, но это не позволяет вам передавать произвольную информацию обратно, даже если это пользовательский тип исключения.
Причина скрыта в обработке исключений класса DomainServices.Hosting.QueryProcessor
.
Если в операции домена возникает необработанное исключение, оно возвращается обратно, а затем в конечном итоге выдается FaultException () (который WCF обрабатывает изначально).
К сожалению, класс DomainServiceFault
очень легкий ... У него всего несколько свойств ...
public class DomainServiceFault
{
public int ErrorCode { get; set; }
public string ErrorMessage { get; set; }
public bool IsDomainException { get; set; }
public string StackTrace { get; set; }
public IEnumerable<ValidationResultInfo> OperationErrors { get; set; }
public IEnumerable<ValidationResult> GetValidationErrors()
{}
}
и они заполняются в ServiceUtility.CreateFaultExceotion()
следующим образом:
DomainServiceFault detail = new DomainServiceFault();
<snip/>
detail.ErrorCode = domainException.ErrorCode;
detail.ErrorMessage = ServiceUtility.FormatExceptionMessage((Exception) domainException);
detail.IsDomainException = true;
if (current != null && !current.IsCustomErrorEnabled)
detail.StackTrace = domainException.StackTrace;
return new FaultException<DomainServiceFault>(detail, new FaultReason(new FaultReasonText(detail.ErrorMessage ?? string.Empty, CultureInfo.CurrentCulture)));
Стоит отметить, что в случае исключения, а не ошибок проверки, OperationErrors
не заполняется.
Таким образом, результатом всего этого является то, что я не верю, что можно обернуть или прикрепить информацию о пользовательских исключениях к обработчику ошибок DomainService (что действительно неудачно).