Сериализация типов MethodBase и Exception в службе WCF - PullRequest
1 голос
/ 09 ноября 2010

Я создал службу WCF для регистрации исключений (я понимаю, что если сеть не работает, что-то не регистрируется ... существуют резервные места)

В любом случае, у нее есть два метода

int LogException(MethodBase methodBase, Exception exception)
int LogMessage(MethodBase methodBase, string message, string data)

Когда я пытаюсь добавить службу в новый проект, файл .cs не создается.Я запустил svcutil, скопировал в проект параметры .cs и config и попытался вызвать службу с сгенерированным клиентом.Я получил следующие две ошибки

Произошла ошибка при попытке сериализации параметра http://tempuri.org/:methodBase. Сообщение InnerException было 'Type' System.Reflection.RuntimeMethodInfo 'с именем контракта данных' RuntimeMethodInfo:http://schemas.datacontract.org/2004/07/System.Reflection' не ожидается.Рассмотрите возможность использования DataContractResolver или добавьте любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив их в список известных типов, переданных в DataContractSerializer. '.Для получения более подробной информации см. InnerException.

С внутренним исключением

Введите 'System.Reflection.RuntimeMethodInfo' с именем контракта данных 'RuntimeMethodInfo: http://schemas.datacontract.org/2004/07/System.Reflection' не ожидается.Рекомендуется использовать DataContractResolver или добавить любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или путем добавления их в список известных типов, передаваемых в DataContractSerializer.

Whatмне нужно сделать, чтобы эта работа?

1 Ответ

5 голосов
/ 09 ноября 2010

При общении через WCF WCF должен точно знать, что будет отправлено через границу.Поэтому брать «Исключение» - это нормально, и все, но почти всегда вы будете передавать подтипы исключений, поэтому вам нужно указать контракту, какие типы исключений будут передаваться через границу.То же самое относится и к MethodBase.Возможно, вы захотите сообщить ему, что иногда будете передавать MethodInfo.

Поскольку это не ваши типы, вы, вероятно, не сможете использовать атрибут KnownType (атрибут обычно помещается вбазовый класс или интерфейс).В этом случае вам нужно использовать Средство обработки контрактов данных.Он сообщает механизму сериализации / десериализации, как найти подтипы.

http://msdn.microsoft.com/en-us/library/ee358759.aspx

Хотя вы можете использовать атрибут ServiceKnownType.Ваш контракт должен выглядеть примерно так:

[DataContract]
public interface ILoggingStuff // choose a better name than this
{
    [OperationContract]
    [ServiceKnownType(typeof(MethodInfo))]
    int LogException(MethodBase methodBase, Exception exception);
    [OperationContract]
    [ServiceKnownType(typeof(MethodInfo))]
    int LogMessage(MethodBase methodBase, string message, string data);
}

Это говорит WCF, что MethodBase может использовать нисходящий Type MethodInfo.

...