Ошибка конфигурации с пользовательским поведением - PullRequest
3 голосов
/ 07 сентября 2010

Я создал пользовательское поведение для использования со службой WCF для регистрации всех ошибок в журнале приложения.Я сделал BehaviorExtensionElement для поведения:

public ErrorLoggingBehaviorExtensionElement : BehaviorExtensionElement
{
    public ErrorLoggingBehaviorExtensionElement() { }

    /* - Elements removed for brevity - */
}

Я пытаюсь применить это в моей конфигурации следующим образом:

<extensions>
  <behaviorExtensions>
    <add name="errorLogging"
         type="ErrorLoggingBehaviorExtensionElement, Logging, Version=1.0.0.0, 
               Culture=neutral, PublicKeyToken=56e8273d901d717f"/>
  </behaviorExtensions>
</extensions>

<services>
  <service name="TestService" behaviorConfiguration="TestServiceBehavior">
    <endpoint address="" 
              binding="wsHttpBinding" 
              contract="Test_Service.ITestService"/>
    <endpoint address="mex" 
              binding="mexHttpBinding" 
              contract="IMetadataExchange"/>
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="TestServiceBehavior">
      <serviceMetadata httpGetEnabled="true"/>
      <errorLogging />
    </behavior>
  </serviceBehaviors>
</behaviors>

ПРИМЕЧАНИЕ. Атрибут «type» элемента регистрации поведения фактически находится в одной строке в моем файле конфигурации, чтобы преодолеть эту известную проблему .Для ваших глаз добавлены разрывы строк.

При попытке просмотреть страницу службы возникает следующая ошибка приложения:

Произошла ошибка при создании обработчика раздела конфигурациидля system.serviceModel / поведение: для этого объекта не определен конструктор без параметров.

Удаление элемента <errorLogging /> делает ошибку исчезающей, но я не вижу, как она связана с сообщаемой ошибкой.

1 Ответ

2 голосов
/ 08 сентября 2010

Проблема на самом деле глубоко в дочерних элементах элемента конфигурации.

Одним из свойств конфигурации было перечисление, украшенное TypeConverterAttribute для выполнения преобразования из строки в перечисление:

[ConfigurationProperty("level", IsRequired=false)]
[TypeConverter(typeof(EnumConverter))]
public LogLevel Level
{
    get { ... }
    set { ... }
}

Исключение, которое выдается, на самом деле относится к типу EnumConverter, не имеющему конструктора без параметров (на самом деле для преобразования в и из него требуется тип перечисления.)создать ConfigurationProperty в конструкторе элемента вместо использования декларативной модели.В какой-то момент я, вероятно, создам класс EnumConverter<T>, чтобы его можно было использовать декларативно.

Это привело к тому, что мне потребовался целый день копания, чтобы окончательно решить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...