我正在创建一个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
答案 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