Как добавить сервис известных типов из внешнего конфигурационного файла - PullRequest
3 голосов
/ 09 марта 2010

Мне сложно понять, как именно добавлять известные типы; для WCF, из файла конфигурации, который является внешним по отношению к моему wcf. Я нашел пример того, как настроить файл конфигурации, однако, я немного запутался относительно того, как этот файл настроен, и я не уверен, как я должен вызывать этот файл конфигурации для загрузки службы. известные типы для моего wcf. Вот пример файла конфигурации, содержащего известные типы.

http://codeidol.com/csharp/wcf/Data-Contracts/Data-Contract-Hierarchy/

Меня смущает, почему вы должны добавить тип a, а затем указать другой тип в качестве дочернего элемента только что добавленного типа. Мне кажется, вы просто добавили бы тип «Контакт», указали его сборку; «Хозяин» и это было бы так. Почему тег элемента knownType следует за тегом элемента add type, указывающим другой тип? Кроме того, когда у меня правильно настроен файл конфигурации, когда и как мне вызвать его из моего wcf? Любая помощь будет оценена. Спасибо!

Обновление 1: ** Хорошо, это дает мне лучшее понимание, спасибо. Я все же попробовал то, что вы сказали, и ServiceKnownTypes не были найдены. Единственное, что я сделал по-другому в своем файле App.config, это в моем сервисе и хосте то, что у меня не было никакого параметра unknownType type = "...", чтобы указать. Вот мое с первого взгляда. У вас есть идея, что я делаю не так?

<system.runtime.serialization>

 <dataContractSerializer>

  <declaredTypes>

   <add type = "Data,TestService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=57f2af9570299a17"/>

  </declaredTypes>

 </dataContractSerializer>

</system.runtime.serialization>

Извините, что опубликовал это в разделе комментариев ранее, надеюсь, это понятнее. **

Обновление 2: Вот кое-что ближе к тому, что я пытаюсь достичь. Что ты думаешь?

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/6b70e9f4-52bc-4fa9-a0ff-c0859e041e85?prof=required

1 Ответ

2 голосов
/ 09 марта 2010

Если вы хотите указать известные типы в конфигурации, следуйте приведенному выше примеру:

<system.runtime.serialization>
   <dataContractSerializer>
      <declaredTypes>
         <add type = "Contact,Host,Version=1.0.0.0,Culture=neutral,
                                                              PublicKeyToken=null">
            <knownType type = "Customer,MyClassLibrary,Version=1.0.0.0,
                                             Culture=neutral,PublicKeyToken=null"/>
         </add>
      </declaredTypes>
   </dataContractSerializer>
</system.runtime.serialization>

Вам не нужно ничего делать, кроме этого - вам не нужно «загружать» конфигурацию или что-то еще - WCF сделает это за вас. Вы должны поместить это в ваш файл web.config (если вы размещаете свою службу в IIS и если ваш клиент является веб-приложением) или в конфигурации вашего приложения (если у вас есть служба Windows на стороне сервера или консоль). / Winforms приложение на стороне клиента). Просто поместите записи в конфиге, а WCF обработает все остальное.

По сути, вы говорите: любой метод, который имеет Contact из моей Host сборки, может также вместо этого возвращать Customer из моей MyClassLibrary сборки.

Итак, в основном вы определяете, что MyClassLibrary.Customer, скорее всего, является потомком типа Host.Contact.

Это то же самое, что и определение в вашем контракте на данные:

[DataContract]
[KnownType(typeof(Customer))]
class Contact
{...}

У вас есть объектный класс Contact, но где бы вы его ни использовали, он также может действительно быть экземпляром класса Customer.

...