2011-08-31 35 views
0

我正在创建一个web服务,它应该从具有相同类名(但位于不同名称空间中)的相同类库中返回两个复杂类型。 当我在浏览器中打开TestService.asmx时,出现异常(请参见下文)。 有没有一种方法(不是重命名课程的班级其他:d)来解决这个在c#web服务中使用与返回类型不同的类作为返回类型

我想装饰我的方法与

[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 
+2

本地化没有错误代码的错误信息......什么洪水猛兽 – ANeves

+0

ICH verstehe nicht:/ – Reniuz

回答

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) 
    { 


    } 
+0

我搜索了几个小时找到这个。非常感谢你。 –

1

尝试加入你的类

[XmlRoot(Namespace = "http://tempuri.org/SubNameSpace")] 

与子命名空间不同的值以上以下属性。

+0

对不起,我忘了提,我不能这样做。这些类不属于我的项目,所以我不能添加属性。但是,对于这个简单的例子可以工作。 –

+0

你不能将它们包装在一个哟你们班?或从他们ihnerit并把属性? –

+0

不能这样做,因为在picuture中,我正在编写一个生成DataAccess Layer的Web服务的T4模板,并且我不想为每个项目创建子类。无论如何,“XmRoot”标签是关键。看看我自己的答案,我可以通过添加'[return:XmlRoot(...)]'属性强制使用不同的XmlRoot。 –

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