RIA Services и FaultContract - PullRequest
       32

RIA Services и FaultContract

4 голосов
/ 11 сентября 2011

Как я могу использовать атрибут FaultContract с RIA Services, чтобы я мог передавать дополнительную информацию в качестве исключения в Silverlight?

1 Ответ

2 голосов
/ 13 марта 2012

Итак, я отправился на охоту через декомпилированный код 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 (что действительно неудачно).

...