我自己托管使用自定义BehaviorExtension的REST服务。当我将行为扩展添加到ServiceBehaviors时,我收到以下错误:
"配置中的元素无效。扩展名称' unityServiceBehavior'未在system.serviceModel / extensions / behaviorExtensions的集合中注册。"
我的App.Config如下:
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<services>
<service behaviorConfiguration="MyServiceTypeBehaviors" name="My.Core.Services.PartyService">
<endpoint behaviorConfiguration="RESTBehavior" binding="webHttpBinding" name="PartyService" contract="My.Core.Services.IPartyService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/parties" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors" >
<serviceMetadata httpGetEnabled="true" />
<!--Adding this behavior causes the error />-->
<UnityServiceBehavior />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="RESTBehavior">
<webHttp helpEnabled="true" />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="UnityServiceBehavior" type="My.Core.Services.UnityServiceBehavior, My.Core.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
</system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup> </configuration>
有关于此的任何想法吗?
编辑:我在某处读到了行为扩展需要在配置中注册才能加载它。
使用配置注册扩展名时,我需要做些什么特别的事情吗?
感谢。
答案 0 :(得分:1)
要添加上面已经很好的答案:我在将它添加到machine.config文件后遇到了这个错误。
我后来才注意到,在排除故障时,我的应用程序池的.NET版本与我调整machine.config文件的.NET版本不同。 (v2.0 vs v4.0)。
将应用程序池设置为正确的版本为我修复了此错误。
非常明显,但很容易错过没有经验的IIS(有时像我一样)。
答案 1 :(得分:0)
UnityServiceBehavior类需要派生自BehaviorExtensionElement。
我是否可以建议您更改行为名称,如下所示:
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors" >
<serviceMetadata httpGetEnabled="true" />
<!--Adding this behavior causes the error />-->
<unityServiceBehavior />
</behavior>
</serviceBehaviors>
<behaviorExtensions>
<add name="unityServiceBehavior" type="My.Core.Services.UnityServiceBehavior, My.Core.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
因为您已经给出了与该类同名的元素(即使是明智的情况),它也可能会使问题浮现......
在您从BehaviorExtensionElement派生的类中,您需要覆盖CreateBehavior()
答案 2 :(得分:0)
最初我收到以下错误:
“配置中的元素无效。扩展名'unityServiceBehavior'未在system.serviceModel / extensions / behaviorExtensions的集合中注册。”
我通过在dll(现在称为My.UnityWCF)上删除行为并在GAC中注册自定义行为来解决此错误。但是,现在我得到了一个新的,但类似的错误。
类型'My.UnityWCF.UnityServiceBehavior,My.UnityWCF,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = ab794c43d4083d4c'的扩展名未在扩展程序集'behaviorExtensions'中注册。
我使用WCF配置编辑器将行为添加到behaviorExtensions集合。
<behaviorExtensions>
<add name="unityWCF" type="My.UnityWCF.UnityServiceBehavior, My.unityWCF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>