自定義行為不會在我的 web.config 中註冊
我有一個使用 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>希望這些東西可以幫助那裡的人。:)