已声明全局属性"http://www.w3.org/XML/1998/namespace:lang"

Dor*_*hen 10 .net xml xsd web-services

我有一个奇怪的问题,我有一个Web服务作为我的系统的一部分安装在一些客户,这意味着每个客户都有一个相同的WS副本.

当我编译WS时,一切都运行良好,在我的服务器和大多数客户机器上,但有一个客户有时会报告以下错误(通常,WS工作正常,这个客户,90%的时间):

Description:
AgentWS: [2852] [525] [Emergency] 
System.Xml.Schema.XmlSchemaException: The global attribute 'http://www.w3.org/XML/1998/namespace:lang' has already been declared.
   at System.Xml.Schema.XmlSchemaSet.InternalValidationCallback(Object sender, ValidationEventArgs e)
   at System.Xml.Schema.BaseProcessor.SendValidationEvent(XmlSchemaException e, XmlSeverityType severity)
   at System.Xml.Schema.BaseProcessor.AddToTable(XmlSchemaObjectTable table, XmlQualifiedName qname, XmlSchemaObject item)
   at System.Xml.Schema.Compiler.Prepare(XmlSchema schema, Boolean cleanup)
   at System.Xml.Schema.XmlSchemaSet.Compile()
   at System.Xml.Serialization.XmlSchemas.Compile(ValidationEventHandler handler, Boolean fullCompile)
   at System.Web.Services.Description.SchemaCompiler.Compile(XmlSchemas schemas)
   at System.Web.Services.Description.WebServicesInteroperability.AnalyzeDescription(ServiceDescriptionCollection descriptions, BasicProfileViolationCollection violations)
   at System.Web.Services.Description.WebServicesInteroperability.CheckConformance(WsiProfiles claims, ServiceDescriptionCollection descriptions, BasicProfileViolationCollection violations)
   at ASP.defaultwsdlhelpgenerator_aspx.Page_Load(Object sender, EventArgs e) in c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\DefaultWsdlHelpGenerator.aspx:line 1439
   at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   at System.Web.UI.Control.OnLoad(EventArgs e)
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Run Code Online (Sandbox Code Playgroud)

任何人有任何想法?谢谢!

Pet*_*dea 8

你的问题正是它所说的:你得到两次定义的特定属性.它可能是由于.NET中的错误(稍后我会引用它)或仅仅是由于配置问题.为了理解我在说什么,更多的是你可以弄清楚如何在你的特定环境中最好地处理它,我会给你一个如何重现它的方法.它全部基于堆栈跟踪中引用的相同XmlSchemaSet对象.

某些步骤特定于我正在使用的工具; 我会尝试提供我能想到的东西.

Base.xsd:这取代了xml.xsd文件

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="something">
        <xs:sequence>
            <xs:element name="aha" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

Some.xsd:这是您设置中其他XSD文件的掌上电脑.有什么特别之处,就是通过各种include/imports它"伸出"到上面的Base.xsd.

<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">    
    <xsd:include schemaLocation="base.xsd"/>
    <xsd:include schemaLocation="http://localhost:9090/base.xsd"/>

    <xsd:element name="a" type="something"/>    
</xsd:schema>
Run Code Online (Sandbox Code Playgroud)

我已经设置了两个包含,模仿多种可能的方法来"伸出"到Base.xsd.

localhost URL应该来自某个http服务器:使用您可以根据需要控制的本地IIS,任何其他HTTP服务器或HTTP模拟软件.

编写一个基于XmlSchemaSet编译"Some.xsd"的C#脚本.来自 Compile方法的在线帮助之类的东西可以工作.

首先,确保第二个包含中的URL不可用.运行脚本.你会看到结果是编译成功!

然后,确保URL正常; 运行脚本.您将获得与您的方案中相同的错误,已定义的内容.

您必须了解架构加载在.NET中的工作方式以及架构编译的工作原理.底线是,如果您从同一个uri加载相同的内容两次或更多次,XSD编译器通常足够聪明,可以解决它.如果从两个不同的URI加载相同的内容,则编译器无法猜出您的意图是什么; 尽管如此,不同的URI意味着不同的模式,因此"已经声明"错误.

基于以上所述,可能是在您获得异常的机器上,可以通过不同的URI访问xml.xsd.

我将使用一个专门的工具来加载您的WSDL并为您提供其所有依赖项(其他WSDL和/或外部XSD)的图形.如果xml.xsd来自两个不同的地方,你应该立即看到它.

如果上面仍然没有产生足够的理解...要进行故障排除,首先看看你是否可以在没有外部连接的情况下运行你的东西("拉网络插头"他说......).然后,在WS运行的机器上运行一个http调试器,Fiddler就是一个例子,在那里你得到了异常,而你却没有.监视错误并与调试跟踪关联.

这应该让你朝着正确的方向前进.与一些评论不同,我不打扰禁用WS-I BP检查; 正如你已经弄明白的那样,这并没有真正解决你的问题.

至于.NET中的错误,它是一个非常遥远但可能的场景.我假设你已经检查了补丁级别.我提到它的唯一原因是因为我自己进入它,我不得不编写自己的解析器来绕过它.即使最新的.NET仍然存在,但它会一直显现出来......这就是为什么我怀疑你的情况是这个错误...