Dot-Net

自定義行為不會在我的 web.config 中註冊

  • November 10, 2011

我有一個使用 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>

可悲的是,我無法完成這項工作。當我這樣做時,Visual Studio 會告訴我

元素“行為”具有無效的子元素“NewtonsoftJsonBehavior”

在上述msdn文章中,據說

要向元素添加配置功能,您需要編寫並註冊一個配置元素。有關這方面的更多資訊,請參閱System.Configuration文件。

定義元素及其配置類型後,就可以使用副檔名了,如下例所示。

我有這種感覺,我所缺少的正是這一點。以某種方式註冊元素及其配置類型。可悲的是,我無法對System.Configuration做出正面或反面,它應該告訴我如何做到這一點。所以這基本上是我的問題:

我如何編寫和註冊配置元素,如果這不是我的問題,那麼問題是什麼?

提前謝謝了!

缺少的部分是 BehaviorExtensionElement 類。在 OP 中,我試圖將 WebHttpBehavior-derivative 添加為元素。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>

然後使用我的自定義 contentTypeMapper 配置 webHttpBinding:

<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>

希望這些東西可以幫助那裡的人。:)

引用自:https://stackoverflow.com/questions/8082231