2011-08-31 4 views
0

같은 클래스 이름을 가진 (그러나 다른 네임 스페이스에있는) 동일한 클래스 라이브러리에서 두 가지 복합 유형을 반환해야하는 webservice를 만들고 있습니다. 브라우저에서 TestService.asmx를 열면 예외가 발생합니다 (아래 참조). (과정의 클래스 이름을 변경 이외 : D)이 문제를 해결하는 방법이있다C# webservice의 반환 유형과 같은 이름의 다른 클래스 사용

내가

[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; } 
    } 
} 

이 예외를 throw합니다.

[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

무형 문화 유산 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:으로 변경하면 모두 완료됩니다. (당신은 PARAMS에 XmlRoot를 추가 할 수 있지만, 어쨌든 필요는 없습니다.

[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

당신은 요 UR 클래스? 또는 그 (것)들에게서 ihnerit 및 속성을두기 위하여? –

+0

큰 그림으로 DataAccess 레이어 용 웹 서비스를 생성하는 T4 템플릿을 작성 중이므로 각 항목을 서브 클래스로 만들고 싶지 않기 때문에 그렇게 할 수 없습니다. 어쨌든, "XmRoot"태그가 열쇠입니다. 내 자신의 대답을 봐, 나는'[return : XmlRoot (...)]'속성을 추가하여 다른 XmlRoot를 강제 할 수있다. –

1

을 VB에 대한 구문은 내가 알아 내려고 시간을 잃은 이후 (무엇을 알고 싶은 사람들을 위해 무엇을 반환에 해당 : 문)입니다 : 오류 코드없이

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