WCF配置错误 - 未注册扩展名

时间:2012-08-23 19:20:21

标签: wcf web-services rest

我自己托管使用自定义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>

有关于此的任何想法吗?

编辑:我在某处读到了行为扩展需要在配置中注册才能加载它。

使用配置注册扩展名时,我需要做些什么特别的事情吗?

感谢。

3 个答案:

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