1

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

对此有任何想法吗?

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

我需要做一些特别的事情来使用配置注册扩展吗?

谢谢。

4

3 回答 3

1

添加上面已经很好的答案:我在将它添加到 machine.config 文件后遇到了这个错误。

后来我才注意到,在故障排除时,我的应用程序池的 .NET 版本与我改编 machine.config 文件的 .NET 版本不同。(v2.0 与 v4.0)。

将应用程序池设置为正确的版本为我修复了这个错误。

很明显,但对于没有 IIS 经验的人来说很容易错过(有时像我一样)。

于 2013-11-13T14:19:58.840 回答
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> 
于 2012-08-28T13:42:59.010 回答
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()

于 2012-08-24T08:42:38.407 回答