当我在IIS中托管这个服务时,我想摆脱我的自定义托管代码,只需将自定义行为添加到我的web.config中。程序如msdn article所示。
所以我试着这样做:
<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告诉我
The element ‘behavior’ has invalid child element ‘NewtonsoftJsonBehavior’
在上述的msdn article,据说
To add configuration abilities to the element,you need to write and register a configuration element. For more information on this,see the 07003 documentation.
After the element and its configuration type are defined,the extension can be used,as shown in the following example.
我有这种感觉,我所缺少的就是这样。不知何故注册元素及其配置类型。可悲的是,我不能使System.Configuration的头或尾,这应该告诉我如何做到这一点。这基本上是我的问题:
如何编写和注册配置元素,如果这不是我的问题,有什么问题?
提前谢谢了!
解决方法
这是我需要的实现:
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,Version=1.0.0.0,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,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>
希望这个东西会帮助有人在那里。