Настройка пользовательского поведения привязки WCF через файл.config - почему это не работает?
Я пытаюсь вставить пользовательское поведение в мой сервисный клиент, следуя приведенному здесь примеру .
Я, кажется, следую за всеми шагами, но я получаю исключение ConfigurationErrorsException. Есть ли кто-нибудь более опытный, чем я, который может определить, что я делаю неправильно?
Вот весь файл app.config.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="ClientLoggingEndpointBehaviour">
<myLoggerExtension />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="myLoggerExtension"
type="ChatClient.ClientLoggingEndpointBehaviourExtension, ChatClient, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
<bindings>
</bindings>
<client>
<endpoint
behaviorConfiguration="ClientLoggingEndpointBehaviour"
name="ChatRoomClientEndpoint"
address="http://localhost:8016/ChatRoom"
binding="wsDualHttpBinding"
contract="ChatRoomLib.IChatRoom"
/>
</client>
</system.serviceModel>
</configuration>
Вот сообщение об исключении:
Произошла ошибка при создании обработчика раздела конфигурации для system.serviceModel/ поведения: элемент расширения "myLoggerExtension" не может быть добавлен к этому элементу. Убедитесь, что расширение зарегистрировано в коллекции расширений в system.serviceModel/extensions/ поведение Extensions. Имя параметра: элемент (C:\Documents and Settings\ Эндрю Шепард \ Мои документы \Visual Studio 2008\Projects\WcfPractice\ChatClient\bin\Debug\ChatClient.vshost.exe.config строка 5)
Я знаю, что правильно написал ссылку на объект ClientLoggingEndpointBehaviourExtension, потому что через отладчик я вижу, как он создается.
2 ответа
Оказывается, я не совсем правильно понял название сборки. Полное имя сборки было достаточно правильным для загрузки.NET Framework, но затем платформа WCF выполняет наивное символьное сравнение при сопоставлении конфигураций поведения.
Чтобы наконец получить точное имя типа, я написал код для создания экземпляра объекта ClientLoggingEndpointBehaviourExtension и записал свойство AssemblyQualifiedName в локальную переменную, которую затем скопировал и вставил из окна отладки в файл.config.
То, что я должен был сделать все это, считается ошибкой в структуре WCF. (См. Эту ссылку) Видимо, это исправлено в.NET 4.0.
Также см. Эту статью.
Это немного случайная мысль, но, возможно, нет: измените порядок элементов в вашей конфигурации, чтобы расширения предшествовали поведению.
-Oisin