C# 使用svcutil从WSDL和XSD生成类时命名空间错误
我有一个第三方WSDL文件和XML模式,用于创建web服务客户机。 大体上,WSDL如下所示:C# 使用svcutil从WSDL和XSD生成类时命名空间错误,c#,xsd,xml-namespaces,xsd-validation,svcutil.exe,C#,Xsd,Xml Namespaces,Xsd Validation,Svcutil.exe,我有一个第三方WSDL文件和XML模式,用于创建web服务客户机。 大体上,WSDL如下所示: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns=
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://sample.com/"
xmlns:types="http://sample.com/types"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns="http://smaple.com/types"
name="Sample"
targetNamespace="http://sample.com/">
<wsdl:types>
<xsd:schema targetNamespace="http://sample.com/types"
xmlns="http://sample.com/types">
<xsd:include schemaLocation="Sample.xsd"/>
<xsd:element name="testReq" type="TestRequestMessage">
</xsd:element>
<xsd:element name="testRes" type="TestResponseMessage">
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="TestReqMessage">
<wsdl:part name="testReq" element="types:testReq"/>
</wsdl:message>
<wsdl:message name="TestResMessage">
<wsdl:part name="testRes" element="types:testRes"/>
</wsdl:message>
<wsdl:portType name="Test_portType">
<wsdl:operation name="TestOp">
<wsdl:input message="tns:TestReqMessage"/>
<wsdl:output message="tns:TestResMessage"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="Test_Binding" type="tns:Test_portType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="TestOp">
<soap:operation soapAction="urn:#TestOp" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="Test_XMLService">
<wsdl:port name="Test-port" binding="tns:Test_Binding">
<soap:address location="http://dummy.sample.com/Test-port"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
现在的问题是,即使我没有根据模式限制设置所有必需的属性或设置一些无效值,验证也不会失败
仔细查看生成的类后,我意识到根元素不在它们应该在的名称空间中
有趣的是,如果我运行xsd.exe Sample.xsd
,生成的类将被放入正确的名称空间,也就是说,与使用svcutil
生成的代码相比,XmlRootAttribute设置了正确的名称和名称空间
我还尝试使用reference
开关在我的svcutil
命令中重用从xsd.exe
工具生成的类。但这导致出现错误,说明找不到System.Runtime.dll
但是,我要做的是创建客户机代码,包括使用svcutil
创建必要的类型类。我怎样才能正确地做到这一点
非常感谢您的帮助。如果您的根元素位于错误的命名空间中,验证程序将认为它只是某个未知元素,而不会尝试验证其内容。您可以打开警告以捕获此问题,请参阅和。至于为什么
svcutil
生成的类具有错误的命名空间,我们需要查看。感谢您的提示。我用一些示例wsdl和xsd内容进一步检查和编辑了我的问题,您可以使用这些内容重现问题。
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://sample.com/types"
xmlns:altova="http://www.altova.com/xml-schema-extensions"
targetNamespace="http://sample.com/types"
elementFormDefault="qualified">
<!-- -->
<!--Root elements -->
<!-- -->
<xsd:element name="TestRequestMessageElement" type="TestRequestMessage">
<xsd:annotation>
<xsd:documentation>Request</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="TestResponseMessageElement" type="TestResponseMessage">
<xsd:annotation>
<xsd:documentation>Response</xsd:documentation>
</xsd:annotation>
</xsd:element>
<!-- -->
<!--Complex types -->
<!-- -->
<xsd:complexType name="TestResponseMessage">
<xsd:sequence>
<xsd:element name="el1" type="Element1">
</xsd:element>
<xsd:element name="el2" type="Element2">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="TestRequestMessage">
<xsd:sequence>
<xsd:element name="el1" type="Element1">
</xsd:element>
<xsd:element name="el2" type="Element2">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Element2">
<xsd:sequence>
<xsd:element name="no1">
<xsd:simpleType>
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="9"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="no2">
<xsd:simpleType>
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="99999999"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Element1">
<xsd:sequence>
<xsd:element name="no3" minOccurs="0">
</xsd:element>
<xsd:element name="date1" type="xsd:dateTime" minOccurs="0">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
TestRequestMessage msg = new TestRequestMessage();
msg.el1 = new ...
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(schemaName))
{
XmlSchema schema = XmlSchema.Read(stream, SchemaValidationHandler);
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add(schema);
using (MemoryStream memStream = new MemoryStream())
{
XmlSerializer ser = new XmlSerializer(typeof(RequestMessage));
ser.Serialize(memStream, msg);
memStream.Position = 0;
bool errors = false;
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas = schemas;
settings.ValidationType = ValidationType.Schema;
settings.ValidationEventHandler += (o, e) => {
// act on validation error
};
using (XmlReader reader = XmlReader.Create(memStream, settings)) {
while (reader.Read()) {}
}