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)
希望这些东西会帮助那里的人.:)
| 归档时间: |
|
| 查看次数: |
14400 次 |
| 最近记录: |