自定义行为不会在我的web.config中注册

Mit*_*hon 20 iis wcf configuration-files wcf-behaviour

我有一个使用Json.NET(newtonsoft)作为自定义序列化程序的工作应用程序.目前我在自定义的WebServiceHostFactory中添加了WebHttpBehavior的衍生物.请参阅本博客末尾的代码段,了解我是如何附加它的.

由于我在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>
Run Code Online (Sandbox Code Playgroud)

可悲的是,我无法做那项工作.当我这样做时,Visual Studio告诉我

元素'behavior'具有无效的子元素'NewtonsoftJsonBehavior'

在上面提到的msdn文章中,据说是这样的

要向元素添加配置功能,您需要编写和注册配置元素.有关此内容的更多信息,请参阅System.Configuration文档.

定义元素及其配置类型后,可以使用扩展名,如以下示例所示.

我有这种感觉,我所缺少的就是那个.以某种方式注册元素及其配置类型.可悲的是,我无法对System.Configuration做出正面或反面,它应该告诉我如何做到这一点.所以这基本上是我的问题:

如何编写和注册配置元素,如果这不是我的问题,那么问题是什么?

提前谢谢了!

Mit*_*hon 39

缺少的部分是BehaviorExtensionElement类.在OP中,我试图将WebHttpBehavior-derivative添加为元素.BehaviorExtensionElement告诉config-parser哪个Type用于某个元素.

这是我需要的实现:

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

    protected override object CreateBehavior()
    {
        return new NewtonsoftJsonBehavior();
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,这还不足以摆脱我的自定义WebServiceHostFactory.因为我还必须添加一个自定义的ContentTypeMapper:

public class NewtonsoftJsonContentTypeMapper : WebContentTypeMapper
{
    public override WebContentFormat GetMessageFormatForContentType(string contentType)
    {
        return WebContentFormat.Raw;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我可以在我的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>
Run Code Online (Sandbox Code Playgroud)

然后使用我的自定义contentTypeMapper配置webHttpBinding:

<bindings>
  <webHttpBinding>
    <binding name="newtonsoftJsonBinding" contentTypeMapper="Newtonsoft.Json.Extensions.NewtonsoftJsonContentTypeMapper, NewtonsoftJsonExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </webHttpBinding>
</bindings>
Run Code Online (Sandbox Code Playgroud)

最后利用上述方法建立端点:

<services>
  <service name="My.Namespaced.MyService" behaviorConfiguration="jsonRestServiceBehavior">
    <endpoint address=""                behaviorConfiguration="jsonRestEndpointBehavior"
              binding="webHttpBinding"  bindingConfiguration="newtonsoftJsonBinding" 
              contract="My.Namespaced.IMyService" />
  </service>
</services>
Run Code Online (Sandbox Code Playgroud)

希望这些东西会帮助那里的人.:)