Пользовательское поведение не будет регистрироваться в моем файле web.config

У меня есть рабочее приложение, использующее Json.NET (newtonsoft) в качестве пользовательского сериализатора. В настоящее время я добавляю эту производную от WebHttpBehavior в пользовательскую WebServiceHostFactory. См. фрагмент кода в конце этот блог за то, как я его прикрепил.

Поскольку я размещаю эту службу в IIS, я хотел бы избавиться от своего пользовательского кода хостинга и просто добавить пользовательское поведение в свой файл web.config. Процедура показана в этой статье msdn.

Поэтому я пытаюсь сделать это так:

<behaviors>
  <endpointBehaviors>
    <behavior name="jsonRest">
      <webHttp defaultOutgoingResponseFormat="Json" />
      <NewtonsoftJsonBehavior/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<extensions>
  <behaviorExtensions>
    <add name="NewtonsoftJsonBehavior" type="Newtonsoft.Json.Extensions.NewtonsoftJsonBehavior, NewtonsoftJsonExtensions, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </behaviorExtensions>
</extensions>

К сожалению, я не могу заставить это работать. Когда я это делаю, Visual Studio сообщает мне, что

Элемент «поведение» имеет недопустимый дочерний элемент «NewtonsoftJsonBehavior»

В вышеупомянутой статье msdn говорится, что

Чтобы добавить возможности конфигурации к элементу, вам необходимо написать и зарегистрировать элемент конфигурации. Дополнительные сведения об этом см. в документации System.Configuration.

После определения элемента и типа его конфигурации можно использовать расширение, как показано в следующем примере.

У меня такое чувство, что мне не хватает именно этого. Как-то зарегистрировать элемент и тип его конфигурации. К сожалению, я не могу разобраться в System.Configuration Который должен подсказать мне, как это сделать. Итак, это в основном мой вопрос:

Как мне написать и зарегистрировать элемент конфигурации, и если это не моя проблема, то в чем проблема?

Спасибо заранее!


person Gaute Løken    schedule 10.11.2011    source источник


Ответы (2)


Недостающая часть — это класс BehaviorExtensionElement. В OP я пытался добавить производную WebHttpBehavior в качестве элемента. BehaviorExtensionElement сообщает синтаксическому анализатору конфигурации, какой тип использовать для определенного элемента.

Вот реализация, которая мне нужна:

public class NewtonsoftJsonBehaviorExtension : BehaviorExtensionElement
{
    public override Type BehaviorType
    {
        get { return typeof(NewtonsoftJsonBehavior); }
    }

    protected override object CreateBehavior()
    {
        return new NewtonsoftJsonBehavior();
    }
}

Конечно, этого было недостаточно, чтобы избавиться от моего пользовательского WebServiceHostFactory. Ибо мне также пришлось добавить собственный ContentTypeMapper:

public class NewtonsoftJsonContentTypeMapper : WebContentTypeMapper
{
    public override WebContentFormat GetMessageFormatForContentType(string contentType)
    {
        return WebContentFormat.Raw;
    }
}

Затем я мог бы использовать их в своем Web.config. Вот соответствующие части рабочего конфига. Сначала настройте расширение и настройте поведение с ним:

<extensions>
  <behaviorExtensions>
    <add name="newtonsoftJsonBehavior" type="Newtonsoft.Json.Extensions.NewtonsoftJsonBehaviorExtension, NewtonsoftJsonExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </behaviorExtensions>
</extensions>
<behaviors>
  <endpointBehaviors>
    <behavior name="jsonRestEndpointBehavior">
      <webHttp/>
      <newtonsoftJsonBehavior/>
    </behavior>
  </endpointBehaviors>
<behaviors>

Затем настройте webHttpBinding с моим пользовательским contentTypeMapper:

<bindings>
  <webHttpBinding>
    <binding name="newtonsoftJsonBinding" contentTypeMapper="Newtonsoft.Json.Extensions.NewtonsoftJsonContentTypeMapper, NewtonsoftJsonExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </webHttpBinding>
</bindings>

Наконец, настройте конечную точку, используя вышеизложенное:

<services>
  <service name="My.Namespaced.MyService" behaviorConfiguration="jsonRestServiceBehavior">
    <endpoint address=""                behaviorConfiguration="jsonRestEndpointBehavior"
              binding="webHttpBinding"  bindingConfiguration="newtonsoftJsonBinding" 
              contract="My.Namespaced.IMyService" />
  </service>
</services>

Надеюсь, что этот материал поможет кому-то там. :)

person Gaute Løken    schedule 11.11.2011

Если вы откроете этот app.config с помощью svcconfigeditor, он должен начать запрашивать выбор сборки, связанной с NewtonsoftJsonBehavior. Если вы выберете это и снова сохраните app.config, решит ли это вашу проблему?

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

person kroonwijk    schedule 10.11.2011
comment
Завтра первым делом попробую svcconfigeditor и отчитаюсь. Что касается другой части, когда я пытаюсь запустить свое приложение, вызов службы показывает мой файл web.config в браузере и выделяет пользовательский тег как причину, по которой служба не может работать. Не помню точное сообщение, но могу опубликовать и завтра, если это поможет. - person Gaute Løken; 11.11.2011
comment
Добавил свой собственный ответ, но проголосовал за ваш, поскольку указание мне на SvcConfigEditor помогло мне отследить, что мне нужно было сделать. - person Gaute Løken; 11.11.2011