Пользовательская обработка исключений в WCF Service и Client - PullRequest
1 голос
/ 03 сентября 2010

Что вы думаете об этом подходе:

Помощник по ошибкам:

[Serializable]
public class WcfHwServiceFault
{
    private readonly Guid _guid;
    private readonly byte[] _data;

    private WcfHwServiceFault(Guid guid, byte[] data)
    {
        _guid = guid;
        _data = data;
    }

    public static WcfHwServiceFault Create(Exception ex)
    {
        var formatter = new SoapFormatter(null, new StreamingContext(StreamingContextStates.CrossMachine));
        var ms = new MemoryStream();
        formatter.Serialize(ms, ex);

        return new WcfHwServiceFault(ex.GetType().GUID, ms.GetBuffer());
    }

    public Exception Get()
    {
        var formatter = new SoapFormatter(null, new StreamingContext(StreamingContextStates.CrossMachine));
        var ms = new MemoryStream(_data);
        return (Exception)formatter.Deserialize(ms);
    }
}

Использование на стороне сервера:

try
{
    ...
}
catch (Exception ex)
{
    throw new FaultException<WcfHwServiceFault>(WcfHwServiceFault.Create(ex));
}

Использование на стороне клиента:

try
{
    Channel.DoSomeMethod(...);
}
catch (FaultException<WcfHwServiceFault> ex)
{
    throw ex.Detail.Get();
}
catch (CommunicationException ex)
{
    throw new ApplicationException("Communication error.", ex);
}

1 Ответ

0 голосов
/ 03 сентября 2010

Интересная идея.Это избавляет вас от необходимости украшать свои услуги сотнями отдельных исключений.

Но почему бы просто не иметь исключение как свойство WcfHwServiceFault?

...