Как я могу обеспечить безопасность типов исключений?

Я использую некоторый код, адаптированный из ServiceModelEx Лоуи, чтобы упаковать исключение внутри FaultException, отправьте его по проводам, а затем распакуйте на клиенте как.NET Exception, Мой сервер может генерировать исключения теоретически любого рода, но давайте использовать SqlException В качестве примера.

Lowy использует отражение для распаковки, поэтому код должен изучить тип исключения, чтобы определить, может ли он создать допустимый объект:

    static Exception ExtractException(ExceptionDetail detail)
    {
        Exception innerException = null;
        if (detail.InnerException != null)
        {
            innerException = ExtractException(detail.InnerException);
        }
        Type type = Type.GetType(detail.Type);
        Debug.Assert(type != null, "Make sure this assembly contains the definition of the custom exception");
        Debug.Assert(type.IsSubclassOf(typeof(Exception)));

        //...
    }

Два вопроса

  1. С SqlExceptions первый сбой Debug.Assert завершается неудачей. Пытаясь заставить их решить на клиенте, я установил ссылку на System.Data, но не повезло. Я предполагаю, что это потому, что без какого-либо фактического System.Data вызов в том клиенте, компилятор удаляет ссылку? Что я могу сделать в краткосрочной перспективе, чтобы заставить моего клиента решить эту проблему? .GetType вызов?

  2. Как правильно "свергнуть" LambdaException в качестве базы ExceptionDetail без потери детализации деталей (например, StackTrace) и без необходимости ссылки на сборку на стороне клиента? Это вообще возможно?

РЕДАКТИРОВАТЬ: это источник, который оборачивает ExceptionDetail как FaultException на сервере. Опять же, это в основном из ServiceModelEx Лоуи:

    public static void PromoteException(Type serviceType, Exception error, MessageVersion version, ref Message fault)
    {
        //Is error in the form of FaultException<T> ? 
        if (error.GetType().IsGenericType && error is FaultException)
        {
            Debug.Assert(error.GetType().GetGenericTypeDefinition() == typeof(FaultException<>));
            return;
        }

        ExceptionDetail exdetail = new ExceptionDetail(error);
        FaultException<ExceptionDetail> faultException = new FaultException<ExceptionDetail>(exdetail);

        MessageFault messageFault = faultException.CreateMessageFault();
        fault = Message.CreateMessage(version, messageFault, faultException.Action);

        //...
    }

0 ответов

Другие вопросы по тегам