Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用svcutil从WSDL和XSD生成类时命名空间错误_C#_Xsd_Xml Namespaces_Xsd Validation_Svcutil.exe - Fatal编程技术网

C# 使用svcutil从WSDL和XSD生成类时命名空间错误

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=

我有一个第三方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="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()) {}
        }