.NET SVCUTIL无法正确生成名称空间 [英] .NET SVCUTIL does not generate namespaces properly

查看:45
本文介绍了.NET SVCUTIL无法正确生成名称空间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a WSDL document with 2 namespaces, and I am trying to generate proxy classes using SVCUTIL.EXE. For some reason, in the generated code the types get placed into default namespace, not in the correct name for mapping provided.

这是我的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>

这是我生成代理的方式:

Here is how I generate proxies:

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

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
    {
        ...
    }

}

任何建议将不胜感激.

推荐答案

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

You can specify what namespaces you would like to get generated:

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

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

This would map all namespaces to the same Test.Namespace1.

当然,您可以映射各个名称空间,例如,如果您的服务是这样定义的:

Of course, you can map individual namespaces, for example, if your service is defined like this:

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

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

您可以使用以下方法分别映射它们:

You could map them individually with:

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

有关更多信息,请查看,但是如果遇到问题,也

For more info, take a look at this but if you run into issues also this

这篇关于.NET SVCUTIL无法正确生成名称空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆