Пользовательское поведение не будет регистрироваться в моем 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, который должен сказать мне, как это сделать. Так что в основном мой вопрос:
Как написать и зарегистрировать элемент конфигурации, и если это не моя проблема, в чем проблема?
Большое спасибо заранее!
Ответы
Ответ 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 всегда подчеркивает расширение синей волной, указывающую, что элемент не знает схему, как вы ее описываете. Однако, когда мы запускаем службу, как служба, так и функция поведения ожидаются.