元素'behavior'在wcf app.config中具有无效的子元素'myFaultExtension'

时间:2011-01-13 06:20:25

标签: wcf wcf-extensions

我正在尝试从Silverlight客户端应用程序中捕获来自WCF服务的常规异常。为此,我已将WCF服务中的相应更改包含在in this MSDN article中。

但是,当我配置行为扩展并在端点行为中使用相同的内容时,上面提到的错误即将出现,并且由于此错误,服务无法运行。

我在这里配置我的配置。请建议我如何解决这个问题?

  <extensions>
      <!--Add a behavior extension within the service model-->
      <!-- Here SilverlightFaultBehavior is a class in AppServiceLib namespace -->
      <behaviorExtensions>
        <add name="myFaultExtension"
             type="AppServiceLib.SilverlightFaultBehavior,AppServiceLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
      </behaviorExtensions>
    </extensions>
   <endpointBehaviors>
        <behavior name="myFaultBehavior">
          <**myFaultExtension**/>
        </behavior>
   </endpointBehaviors>

5 个答案:

答案 0 :(得分:2)

在程序集编译/构建期间自动增加程序集的版本时,这会导致问题。

自.NET 4.0起修复。版本/ Culture / PublicKeyToken 可能被删除,以便配置不再需要版本的自动增量值。

<behaviorExtensions>
    <add name="serviceKeyBehavior"  
     type="MyNamespace.ServiceKeyBehaviorExtensionElement, MyAssembly"/>
</behaviorExtensions>

答案 1 :(得分:1)

尝试使用编辑器在web.config中定义WCF以防止出错。 (特别是当您需要编写整个类型名称时)。

右键单击web.config,然后单击Edit WCF Configuration:

enter image description here

然后转到:高级 - &gt;扩展程序 - &gt;行为元素扩展 - &gt;新

enter image description here

然后在(常规)下单击左侧小按钮并选择新行为。它将在app.config中为您编写完整的类型名称。

enter image description here

现在,您可以使用正确的类型名称在app.config中的<extensions>标记下查看新行为。

答案 2 :(得分:1)

我的自定义行为扩展程序出现此错误,我想将其添加为端点行为。因此,我编辑了Visual Studio 2017中使用的模式,以消除我的web.config文件中的警告。这是你收到的警告:

  

元素'behavior'具有无效的子元素'CustomSecurity'。预期可能元素的列表:'clientVia,callbackDebug,callbackTimeouts,clear,clientCredentials,transactedBatching,dataContractSerializer,dispatcherSynchronization,remove,synchronousReceive,webHttp,enableWebScript,endpointDiscovery,soapProcessing'。

我的web.config有:

<system.serviceModel>
    <extensions>
        <behaviorExtensions>
            <add name="CustomSecurity"
                type="FullyQualifiedPath.MyCustomBehaviorExtension, MyAssemblyName"/>
            </behaviorExtensions>
    </extensions>
    <endpointBehaviors>
       <behavior name="CustomServiceBehavior">
          <CustomSecurity />
       </behavior>
    </endpointBehaviors>
    <endpoint address="https://SomeServer/MyService.svc/soap"
    behaviorConfiguration="CustomServiceBehavior" binding="basicHttpBinding"
    bindingConfiguration="BasicHttpBinding_IProject" contract="ProjectService.IProject"
    name="BasicHttpBinding_IProject" />

CustomSecurity XML节点在Visual Studio中始终具有蓝色波浪线。它在错误列表窗口中显示为警告。我想摆脱它,因为每次我尝试更新服务引用时,由于web.config中的警告,它都会失败。

因此,要修复它,您需要编辑Visual Studio用于验证元素的模式。所以,我打开了我的web.config,然后在主Visual Studio菜单栏上选择了XML。然后选择Schemas。你会得到一长串的模式。找到“DotNetConfig.xsd”(或DotNetConfig [XX] .xsd,其中XX是.NET Framework版本),如下所示。enter image description here

更新:您可能希望使用DotNetConfig文件前缀编辑任何/所有xsd文件。通常,您不希望一次使用所有DotNetConfigXX.xsd文件。最好只打开一个“使用此架构”选项(在“使用”列中);否则,您可能会看到有关已定义的架构元素的错误。

浏览到“位置”列中显示的路径,然后编辑xsd文件。搜索:<xs:element name="behavior" vs:help="configuration/system.serviceModel/behaviors/endpointBehaviors/behavior">

然后在xs:choice节点中添加一个新的xs:element节点,其中包含自定义行为扩展的名称;就我而言,CustomSecurity。保存文件,Visual Studio应自动验证新架构,您不应再在web.config中收到警告。

<xs:element name="behavior" vs:help="configuration/system.serviceModel/behaviors/endpointBehaviors/behavior">
<xs:complexType>
<xs:annotation>
    <xs:documentation>The behavior element contains a collection of settings for the behavior of an endpoint.</xs:documentation>
</xs:annotation>
<xs:choice minOccurs="0" maxOccurs="unbounded">
    <xs:element name="CustomSecurity" vs:help="configuration/system.serviceModel/behaviors/endpointBehaviors/behavior/CustomSecurity">
        <xs:complexType>
            <xs:annotation>
                <xs:documentation>Specifies the behavior extension class applied to the endpoint.</xs:documentation>
            </xs:annotation>
            <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict" />
        </xs:complexType>
    </xs:element>
    <xs:element name="clientVia" vs:help="configuration/system.serviceModel/behaviors/endpointBehaviors/behavior/clientVia">
        <xs:complexType>
            <xs:annotation>
                <xs:documentation>Specifies the URI for which the transport channel should be created.</xs:documentation>
            </xs:annotation>
            <xs:attribute name="viaUri" type="xs:string" use="optional">
                <xs:annotation>
                    <xs:documentation>A string that specifies a URI that indicates the route a message should take.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="lockAttributes" type="xs:string" use="optional" />
            <xs:attribute name="lockAllAttributesExcept" type="xs:string" use="optional" />
            <xs:attribute name="lockElements" type="xs:string" use="optional" />
            <xs:attribute name="lockAllElementsExcept" type="xs:string" use="optional" />
            <xs:attribute name="lockItem" type="boolean_Type" use="optional" />
            <xs:anyAttribute namespace="http://schemas.microsoft.com/XML-Document-Transform" processContents="strict" />
        </xs:complexType>
    </xs:element>

答案 3 :(得分:0)

我遇到了同样的问题。我的解决方案实际上是在前面提到的重复发布Hearing "element 'behavior' has invalid child element" should be ignored, but prevented from updating service reference because of it中提供的。原来'类型'字段非常敏感。在其他帖子中使用Console.WriteLine(typeof(BetterErrorMessagesFaultBehavior).AssemblyQualifiedName);作为answer提及,以获得我需要的确切类型。

    <add name="myFaultExtension"
         type="AppServiceLib.SilverlightFaultBehavior,AppServiceLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>

答案 4 :(得分:0)

iCode的解决方案对我有用但我必须编辑在...... Xml / Schemas /中找到的所有版本的DotNetCofig4x.xsd文件。 x在4x.xsd中表示40.xsd,45.xsd,47.xsd和471.xsd