WCF DataContractSurrogate с разными не унаследованными типами

цель

Для динамического предоставления конечной точки RSS/Atom для службы с неизвестным перечисляемым типом. Тип будет найден с помощью отражения для построения конечных точек синдикации.

Подход

Я использую.net 4.0

Я размышляю над DLL, чтобы выставить конечные точки, то есть json, xml, soap. Это все работает так, как я хочу. (Таким образом, я использую код для настройки моей настройки WCF).

Сейчас я пытаюсь предоставить конечную точку rss для всей коллекции ICollection, найденной с помощью отражения, предоставляемой моими службами, чтобы я мог предоставить SyndicationFeed для каждого метода, возвращающего ICollection.

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

Я получаю следующее исключение из программы просмотра svclog:

Тип исключения:

System.Runtime.Serialization.InvalidDataContractException, System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Сообщение:

Using surrogates with get-only collection properties is not supported.  Consider removing the surrogate associated with 'System.Collections.Generic.Dictionary`2[[System.Xml.XmlQualifiedName, System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.  

Вопросы

  1. Концептуально, каковы мои варианты достижения того, чего я хочу достичь?
  2. Могу ли я сохранить безопасный для вывода тип SyndicationFeed, вместо того, чтобы записывать adhoc в строку xml?

1 ответ

Почему вы суррогатный словарь, хотя? Я не понимаю, почему ваш метод, например, не просто возвращает Object или даже просто ICollection как есть, поэтому вы полиморфно возвращаете любой объект, который хотите, используя любой тип DLL, который вы хотите.

Не зная этого сценария, я хочу порекомендовать вам также попробовать DataContractResolver. Посмотрите этот пост в блоге, этот образец и страницу MSDN, чтобы начать. По сути, это помогает вам сопоставить один тип с другим представлением xsi:type на проводе, что может быть всем, что вы хотите.

Вы уверены, что исчерпали все свои варианты в отношении известных типов? Смотрите этот пост в блоге для тщательного рассмотрения темы.

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