2009-03-04 2 views
3

웹 서비스 컨텍스트에서 Mammal 클래스를 상속 한 다음 클래스가 있습니다. Mammal 클래스는 프록시에서 정의됩니다. 나는 그 클래스의 정의를 바꿀 수 없다. 클라이언트 측에서 Mammal 클래스에 몇 가지 메소드를 추가해야하기 때문에 Mammal을 상속하고 Giraffe를 만들었습니다. 내가 형 포유류의 객체를 기대의 WebMethod를 호출 할 때WebService, WebMethod 및 상속

namespace TestApplication 
{ 
    public class Giraffe : Mammal 
    { 
     public Giraffe() 
     { 
     } 
    } 
} 

, 나는 기린이 예상되지 않는다는 것을 말해 다음과 같은 예외를 얻을.

Error: System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type Giraffe was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically. 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write6_Tender(String n, String ns, Tender o, Boolean isNullable, Boolean needType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write12_PaymentRequestAuthorization(String n, String ns, PaymentRequestAuthorization o, Boolean isNullable, Boolean needType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write13_PaymentRequestAuthorization(Object o) 
    --- End of inner exception stack trace --- 

해결 방법이 있습니까? 나는 정말로 XmlInclude를 추가 할 수 없다 ...

+0

이 스레드 http://stackoverflow.com/questions/20084/xml-serialization-and-inherited-types에서 보라 –

답변

2

메소드를 추가하려면 부분 클래스를 사용해야한다. (등 네임 스페이스 오른쪽)와 두 번째 클래스 파일을 추가하십시오 :

partial class Mammal { 
    public void ExtraMethod() {...} 
} 

partial 키워드는 클래스가 여러 파일에 걸쳐 분할 할 수 있도록 컴파일러를 알려줍니다 - 코드 생성 시나리오에 적합합니다. 그러나 모든 파일에서 partial 키워드를 요구합니다. 멤버는 단순히 결합됩니다 (C# 3.0의 부분 메서드는 제외). I 희망이 wsdl.exe (또는 무엇이든)이 포함!

+0

나는이 경우에는 부분 클래스를 사용할 수 없습니다 두렵다. 서버의 클래스를 어떻게 변경합니까? – Martin

+1

호기심에서 벗어난 이유는 무엇입니까? 특히, 프록시는 서버에 있지 않습니다 ... 실제로 무엇을하려고합니까? 지금까지 귀하의 설명은 대략 "클라이언트 측 웹 서비스 프록시에 메소드 추가"입니다. 부분 클래스가 해당 시나리오에 대한 정답입니다 ... –

1

XmlInclude를 사용해야합니다. 너의 유일한 선택이야. 직렬화를 수행 할 코드를 생성해야하므로 직렬화 할 클래스를 직렬화에 알려야합니다.

기린이 IXmlSerializable을 구현하는 데 어려움을 겪었을 수도 있지만, 그것은 훨씬 더 많은 작업입니다.

2

변경할 수없는 클래스에 메서드를 추가하려면 확장 메서드 만 만들면됩니다.

public static class MammalExt { 
public static void ExtraMethod(this Mammal mammal) {...}} 

포유 동물이 프록시 생성 클래스 인 경우 부분 클래스 여야합니다.

1

정답은 실제로 부분 수업을 사용하는 것입니다. 클라이언트 프로젝트를 열고 웹 참조를 생성하면 Visual Studio는 WSDL을 구문 분석하고 Mammal이라는 클래스를 생성합니다. 이 클래스는 클라이언트 프로젝트에서만 볼 수 있으므로 서버쪽에 대해 걱정할 필요가 없습니다.

MyWebService라는 웹 참조가 있다고합시다. 그러면 MyWebService.Mammal이라는 수업이 있습니다. 이 클래스에 구성원을 추가하려면, 당신이해야 할 모든이 포함 된 새 소스 파일을 생성한다 :

namespace MyWebService { 
    public partial class Mammal { 
     public void ExtraMethod() { ... } 
    } 
} 

당신이 Mammal, 웹 참조 코드가 새로 생성됩니다를 반환 웹 서비스의 메소드를 호출 인스턴스의 "개선 된"Mammal 클래스를 호출하고 와이어의 XML에서 인스턴스로 값을 복사합니다.