Как я могу обеспечить безопасность типов исключений?
Я использую некоторый код, адаптированный из 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)));
//...
}
Два вопроса
С SqlExceptions первый сбой Debug.Assert завершается неудачей. Пытаясь заставить их решить на клиенте, я установил ссылку на
System.Data
, но не повезло. Я предполагаю, что это потому, что без какого-либо фактическогоSystem.Data
вызов в том клиенте, компилятор удаляет ссылку? Что я могу сделать в краткосрочной перспективе, чтобы заставить моего клиента решить эту проблему?.GetType
вызов?Как правильно "свергнуть"
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);
//...
}