Exception.TargetSite является нулевым после десериализации с двоичным форматером - PullRequest
1 голос
/ 05 июля 2011

У нас проблема с десериализацией исключения. Я полностью осознаю, что отправлять исключения по сети - это плохая практика, но текущая настройка требует этого для интеграции наших систем.

Серверная система - это служба .net 4 wcf, а вызывающая сторона - .net 2, которая вызывает .4 с использованием стандартной веб-ссылки.

Серверная сторона просто сериализует исключение и кодирует его в строку Base64.

      var formatter = new BinaryFormatter();
      var mem = new MemoryStream();
      formatter.Serialize(mem, ex);
      EncodedException = Convert.ToBase64String(mem.ToArray());

На приемном конце

      var formatter = new BinaryFormatter();
      messageChannel.ServerException = (Exception)
      formatter.Deserialize(new MemoryStream(Convert.FromBase64String(base64string)));

Все есть, кроме TargetSite.

Любые намеки приветствуются.

Спасибо

Юхан

1 Ответ

2 голосов
/ 05 июля 2011

Exception.TargetSite Получает метод, который выбрасывает текущее исключение.Согласно MSDN: свойство TargetSite может не точно содержать имя метода, в котором было сгенерировано исключение, если обработчик исключений обрабатывает исключение через границы домена приложения.

Это имеет смысл, поскольку может быть присвоено возвращаемое значениетолько если TargetSite объекта expetion существует в вашем удаленном коде / приложении (и, вероятно, нет, поскольку это может быть другой код / ​​приложение).

Это то же самое, что сериализовать отражение объекта.Объект C # отправляет его по сети, сериализует и ожидает, что он будет работать так же, как и на локальном сайте, даже если отраженные объекты не существуют на удаленном сайте.Вкратце: отражение класса без класса - ничто.

...