在c#webservice中使用与返回类型同名的不同类

时间:2011-08-31 12:39:04

标签: c# web-services asmx

我正在创建一个webservice,它应该从同一个类库中返回两个具有相同类名的复杂类型(但是存在于不同的名称空间中)。 当我在浏览器中打开TestService.asmx时,我得到一个例外(见下文)。 有没有办法解决这个问题(除了重命名课程:D)

我尝试用

装饰我的方法
[WebMethod(MessageName="MyNamespace1.SomeClass")]

[return: XmlElement("SomeClass1", Namespace = "http://tempuri.org/NameSpace1")]

-

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace MyWebservice
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class TestService : System.Web.Services.WebService
    {

        public MyNamespace1.SomeClass GetSomeClass1()
        {
            return new MyNamespace1.SomeClass() { Name = "SomeClass1" };
        }

        public MyNamespace2.SomeClass GetSomeClass2()
        {
            return new MyNamespace2.SomeClass() { Name = "SomeClass1" };
        }

    }

}

namespace MyNamespace1
{
    public class SomeClass
    {
        public string Name { get; set; }
    }
}

namespace MyNamespace2
{
    public class SomeClass
    {
        public string Name { get; set; }
    }
}

抛出此异常:

[InvalidOperationException: Die Typen 'MyNamespace2.SomeClass' und 'MyNamespace1.SomeClass' verwenden den XML-Typnamen 'SomeClass' im Namespace 'http://tempuri.org/'. Geben Sie mit XML-Attributen einen eindeutigen XML-Namen und/oder Namespace für den Typ an.]
   System.Xml.Serialization.XmlReflectionImporter.GetTypeMapping(String typeName, String ns, TypeDesc typeDesc, NameTable typeLib, Type type) +4071889
   System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter) +150
   System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter) +1604

3 个答案:

答案 0 :(得分:2)

好的,我通过反复试验找到了解决方案。 关键是要结合[return: XmlRoot...]和[return:XmlElement ...]`装饰来使它工作。

    [WebMethod]
    [return: XmlRoot(Namespace = "http://tempuri.org/Namespace1")]
    [return: XmlElement(Namespace = "http://tempuri.org/Namespace1",
        ElementName = "SomeClass")]
    public MyNamespace1.SomeClass GetSomeClass1()
    {
        return new MyNamespace1.SomeClass() { Name = "SomeClass1" };
    }

    [WebMethod]
    [return: XmlRoot(Namespace = "http://tempuri.org/Namespace2")]
    [return: XmlElement(Namespace = "http://tempuri.org/Namespace2",
        ElementName = "SomeClass")]
    public MyNamespace2.SomeClass GetSomeClass2()
    {
        return new MyNamespace2.SomeClass() { Name = "SomeClass1" };
    }

更新:这也适用于方法参数。只需将return:更改为param:,即可完成。 (你无法将XmlRoot添加到params,但无论如何都不需要。

    [WebMethod]
    public void AddSomeClass1([param: XmlElement(
        Namespace = "http://tempuri.org/Namespace1",
        ElementName = "SomeClass")] MyNamespace1.SomeClass class1)
    {


    }

    [WebMethod]
    public void AddSomeClass2([param: XmlElement(
        Namespace = "http://tempuri.org/Namespace2",
        ElementName = "SomeClass")] MyNamespace2.SomeClass class2)
    {


    }

答案 1 :(得分:1)

尝试在类

上添加以下属性
[XmlRoot(Namespace = "http://tempuri.org/SubNameSpace")]

子命名空间的值不同。

答案 2 :(得分:1)

对于那些想知道VB的语法是什么的人(因为我失去了一些时间试图找出与return:语句相同的东西):

<WebMethod> _
Public Function GetSomeClass1() As <XmlRoot(Namespace:="http://tempuri.org/Namespace1"), XmlElement("SomeClass", Namespace:="http://tempuri.org/Namespace1")> MyNamespace1.SomeClass
    ' Return Stuff
End Function