Отладка добавления известных типов через config - PullRequest
0 голосов
/ 24 марта 2011

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

У меня есть служба WCF, размещенная в службе Windows, и у меня есть файл конфигурации для службы. В конфиге у меня так:

<configuration>
...
  <system.runtime.serialization>
    <dataContractSerializer>
      <declaredTypes>
        <add type="My.Full.Interface.Name, My.Assembly.Name.With.No.dll">
          <knownType type="My.Full.Implementation.Class.Name, My.Assembly.Name.With.No.dll"/>              
        </add>
      </declaredTypes>
    </dataContractSerializer>
  </system.runtime.serialization>
...
</configuration>

Я пытался добавить Version=1.0.0.0,Culture=neutral,PublicKeyToken=null к обоим объявлениям, но я не могу заставить сериализатор контракта данных их забрать.

Я проверил, что этот класс можно вернуть (добавив [ServiceKnownType(typeof(My.Implementation.Class))]), и это работает, но у меня есть другая реализация, которую я хочу использовать, которая находится в другой сборке, которая создала бы циклическую ссылку, если бы я добавил ее, поэтому не могу использовать это.

Как мне отладить, почему сериализатор данных не находит мой тип? Или что не так с моей декларацией?

Ответы [ 2 ]

0 голосов
/ 24 марта 2011

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

Я смог обойти его,используя предложение в этом ответе

 [ServiceKnownType ("GetKnownTypes", typeof (KnownTypesProvider))] 

на интерфейсе службы, а затем предоставляя класс и метод для предоставления типов:

internal static class KnownTypesProvider
    {
    public static IEnumerable<Type> GetKnownTypes (ICustomAttributeProvider provider)
        {            
        return new[] {Type.GetType ("Assembly qualified type name")};
        }
    } 

, что также позволило разрешитьтипов, которые находятся в разных сборках.Хотя это работает, это не очень хорошо, поэтому я, вероятно, в конечном итоге пойду к решению, которое использует конфигурацию, как в этом answer , или добавит атрибут soem в мои классы и использует его для идентификации известных типов.

0 голосов
/ 24 марта 2011

Если вы ищете способ отладки службы Windows, попробуйте добавить строку System.Diagnostics.Debugger.Break(); при запуске службы. Я не знаю, достаточно ли рано, чтобы выяснить, почему инфраструктура сериализации не использует ваш dataContractSerializer.

Я не вижу ошибок в элементе <system.runtime.serialization>, который вы опубликовали. Вы исследовали остальную часть файла exe.config на предмет семантических ошибок?

...