8

我正在尝试从 Silverlight 客户端应用程序中的 WCF 服务中捕获常规异常。为此,我在我的 WCF 服务中包含了相应的更改,如MSDN 文章中所述

但是当我配置行为扩展并在端点行为中使用相同的行为时,就会出现上述错误,并且由于此错误,服务无法运行。

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

  <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>
4

5 回答 5

5

我想添加为端点行为的自定义行为扩展出现此错误。因此,我编辑了 Visual Studio 2017 中使用的架构,以消除 web.config 文件中的警告。这与您收到的警告相同:

元素“行为”具有无效的子元素“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" />

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

因此,要修复它,您需要编辑 Visual Studio 用于验证元素的架构。因此,我打开了我的 web.config,然后在 Visual Studio 主菜单栏上选择了 XML。然后选择架构。您将获得一长串模式。如下所示,找到“DotNetConfig.xsd”(或 DotNetConfig[XX].xsd,其中 XX 是 .NET Framework 版本)。在此处输入图像描述

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

浏览至 Location 列中显示的路径并编辑 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>
于 2017-04-27T16:07:39.957 回答
2

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

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

<behaviorExtensions>
    <add name="serviceKeyBehavior"  
     type="MyNamespace.ServiceKeyBehaviorExtensionElement, MyAssembly"/>
</behaviorExtensions>
于 2015-05-28T09:00:14.190 回答
1

我遇到了同样的问题。我的解决方案实际上是在前面提到的重复发布中提供的,听力“元素'行为'有无效的子元素”应该被忽略,但因此无法更新服务参考。原来“类型”字段非常敏感。最后在另一篇文章中使用Console.WriteLine(typeof(BetterErrorMessagesFaultBehavior).AssemblyQualifiedName);提到的作为答案来获得我需要的确切类型。

    <add name="myFaultExtension"
         type="AppServiceLib.SilverlightFaultBehavior,AppServiceLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
于 2013-01-24T22:17:06.227 回答
1

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

右键单击 web.config,然后编辑 WCF 配置:

在此处输入图像描述

然后去:高级-->扩展-->行为元素扩展-->新建

在此处输入图像描述

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

在此处输入图像描述

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

于 2016-09-30T22:27:24.400 回答
1

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

于 2018-03-30T17:45:24.370 回答