Подтвердить что ты не робот

Пользовательское поведение не будет регистрироваться в моем 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, который должен сказать мне, как это сделать. Так что в основном мой вопрос:

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

Большое спасибо заранее!

4b9b3361

Ответ 1

Пропущенный элемент - это класс BehaviorExtensionElement. В OP я пытался добавить WebHttpBehavior-производное в качестве элемента. Элемент BehaviorExtensionElement сообщает config-parser, который Type использует для определенного элемента.

Здесь мне понадобилась реализация:

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>

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

Ответ 2

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

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