.NET SVCUTIL无法正确生成名称空间

时间:2013-04-03 21:17:03

标签: c# .net svcutil.exe

我有一个带有2个命名空间的WSDL文档,我正在尝试使用SVCUTIL.EXE生成代理类。出于某种原因,在生成的代码中,类型被置于默认命名空间中,而不是正确的映射名称。

这是我的WSDL:

<?xml version='1.0' encoding='UTF-8'?>
<wsdl:definitions name="TestService" 
    targetNamespace="My.Namespace.1" 
    xmlns:ns1="http://schemas.xmlsoap.org/soap/http" 
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
    xmlns:tns="My.Namespace.1" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <wsdl:types>
        <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="My.Namespace.1" xmlns:ns1="My.Namespace.2" xmlns:tns="My.Namespace.1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <xs:import namespace="My.Namespace.2"/>

            <xs:element name="TestOpRequest" type="tns:TestOpRequest"/>
            <xs:element name="TestOpResponse" type="tns:TestOpResponse"/>

            <xs:complexType name="TestOpRequest">
                <xs:sequence>
                    <xs:element ref="ns1:Type1"/>
                </xs:sequence>
            </xs:complexType>

            <xs:complexType name="TestOpResponse">
                <xs:sequence>
                </xs:sequence>
            </xs:complexType>

        </xs:schema>
        <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="My.Namespace.2" xmlns:tns="My.Namespace.2" xmlns:xs="http://www.w3.org/2001/XMLSchema">
            <xs:element name="Type1" type="tns:Type1"/>

            <xs:complexType name="Type1">
                <xs:sequence>
                    <xs:element name="prop1" type="xs:string"/>
                    <xs:element name="prop2" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>

        </xs:schema>
    </wsdl:types>

    <wsdl:message name="testOp">
        <wsdl:part element="tns:TestOpRequest" name="parameter"/>
    </wsdl:message>

    <wsdl:message name="testOpResponse">
        <wsdl:part element="tns:TestOpResponse" name="parameter"/>
    </wsdl:message>

    <wsdl:portType name="TestService">
        <wsdl:operation name="testOp">
            <wsdl:input message="tns:testOp" name="testOp"/>
            <wsdl:output message="tns:testOpResponse" name="testOpResponse"/>
        </wsdl:operation>
    </wsdl:portType>

    <wsdl:binding name="TestServiceSoapBinding" type="tns:TestService">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="testOp">
            <soap:operation soapAction="" style="document"/>
            <wsdl:input name="testOp">
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output name="testOpResponse">
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="TestService">
        <wsdl:port binding="tns:TestServiceSoapBinding" name="TestServicePort">
            <soap:address location="http://localhost/TestService"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

以下是我生成代理的方法:

SvcUtil.exe / t:code test.wsdl /n:My.Namespace.1,Test.Namespace1 /n:My.Namespace.2,Test.Namespace2 /o:Test.cs

以下是生成的内容:

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="My.Namespace.1")]
public partial class TestOpRequest
{

    private Type1 type1Field;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Namespace="My.Namespace.2", Order=0)]
    public Type1 Type1
    {
        get
        {
            return this.type1Field;
        }
        set
        {
            this.type1Field = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="My.Namespace.2")]
public partial class Type1
{

    private string prop1Field;

    private string prop2Field;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=0)]
    public string prop1
    {
        get
        {
            return this.prop1Field;
        }
        set
        {
            this.prop1Field = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=1)]
    public string prop2
    {
        get
        {
            return this.prop2Field;
        }
        set
        {
            this.prop2Field = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="My.Namespace.1")]
public partial class TestOpResponse
{
}
namespace Test.Namespace1
{


    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace="My.Namespace.1", ConfigurationName="Test.Namespace1.TestService")]
    public interface TestService
    {

        // CODEGEN: Generating message contract since the operation testOp is neither RPC nor document wrapped.
        [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
        [System.ServiceModel.XmlSerializerFormatAttribute()]
        Test.Namespace1.testOpResponse testOp(Test.Namespace1.testOp request);
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
    public partial class testOp
    {

        [System.ServiceModel.MessageBodyMemberAttribute(Namespace="My.Namespace.1", Order=0)]
        public TestOpRequest TestOpRequest;

        public testOp()
        {
        }

        public testOp(TestOpRequest TestOpRequest)
        {
            this.TestOpRequest = TestOpRequest;
        }
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    [System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
    public partial class testOpResponse
    {

        [System.ServiceModel.MessageBodyMemberAttribute(Name="TestOpResponse", Namespace="My.Namespace.1", Order=0)]
        public TestOpResponse TestOpResponse1;

        public testOpResponse()
        {
        }

        public testOpResponse(TestOpResponse TestOpResponse1)
        {
            this.TestOpResponse1 = TestOpResponse1;
        }
    }

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public interface TestServiceChannel : Test.Namespace1.TestService, System.ServiceModel.IClientChannel
    {
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public partial class TestServiceClient : System.ServiceModel.ClientBase<Test.Namespace1.TestService>, Test.Namespace1.TestService
    {

        public TestServiceClient()
        {
        }

        public TestServiceClient(string endpointConfigurationName) : 
                base(endpointConfigurationName)
        {
        }

        public TestServiceClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress)
        {
        }

        public TestServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress)
        {
        }

        public TestServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress)
        {
        }

        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
        Test.Namespace1.testOpResponse Test.Namespace1.TestService.testOp(Test.Namespace1.testOp request)
        {
            return base.Channel.testOp(request);
        }

        public TestOpResponse testOp(TestOpRequest TestOpRequest)
        {
            Test.Namespace1.testOp inValue = new Test.Namespace1.testOp();
            inValue.TestOpRequest = TestOpRequest;
            Test.Namespace1.testOpResponse retVal = ((Test.Namespace1.TestService)(this)).testOp(inValue);
            return retVal.TestOpResponse1;
        }
    }
}

以下是我需要生成的内容:

namespace Test.Namespace2
{
    public partial class Type1
    {
        ....
    }
}

namespace Test.Namespace1
{
    public partial class TestOpRequest
    {
        private Test.Namespace2 type1Field;
        ...
    }

    public partial class TestOpResponse
    {
    }

    public interface TestService
    {
        Test.Namespace1.testOpResponse testOp(Test.Namespace1.testOp request);
    }

    public partial class testOp
    {
        ...
    }

    public partial class testOpResponse
    {
        ...
    }

}

任何建议都将受到赞赏。

1 个答案:

答案 0 :(得分:9)

您可以指定要生成的名称空间:

svcutil /n:*,Test.Namespace1 (... other args for svcutil not shown)

这会将所有名称空间映射到相同的Test.Namespace1

当然,您可以映射各个命名空间,例如,如果您的服务定义如下:

[ServiceContract(Namespace = "http://test.com/wsdl/MyFirstService")]
public interface IMyFirstService
{
}

[ServiceContract(Namespace = "http://test.com/wsdl/MySecondService")]
public interface IMySecondService
{
}

您可以使用以下方式单独映射它们:

svcutil /n:http://test.com/wsdl/MyFirstService,Test.Namespace1 
        /n:http://test.com/wsdl/MySecondService,Test.Namespace2
(etc...)

有关详细信息,请查看this,但如果您遇到问题this

相关问题