문제

웹 서비스 맥락에서, 나는 클래스 포유류에서 물려받는 다음 수업이 있습니다. 포유류 클래스는 프록시로 정의됩니다. 그 클래스의 정의를 변경할 수 없습니다. 클라이언트 측의 클래스 포유류에 몇 가지 방법을 추가해야하기 때문에 포유류를 물려 받고 기린을 만들었습니다.

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

유형 유형의 포유류 대상을 기대하는 WebMethod를 호출 할 때 기린이 예상되지 않는다는 다음과 같은 예외를 얻습니다.

  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를 실제로 추가 할 수 없습니다 ...

도움이 되었습니까?

해결책

방법을 추가하려면 부분 클래스를 사용해야합니다. (오른쪽 네임 스페이스 등)와 함께 2 등석 파일을 추가 해보십시오.

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

그만큼 partial 키워드는 컴파일러에게 클래스가 여러 파일을 통해 분할 될 수 있도록 지시합니다. 코드 생성 시나리오에 이상적입니다. 그러나 그것은 요구합니다 partial 모든 파일의 키워드; 회원은 단순히 결합되어 있습니다 (C# 3.0의 부분 방법 제외는 자신의 미묘한 행동이 있습니다). 나 희망 그 wsdl.exe (또는 무엇이든)가 이것을 포함합니다!

다른 팁

클래스에 메소드를 추가하려면 변경할 수 없습니다. 확장 메소드 만 작성하십시오.

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

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

xmlinclude를 사용해야합니다. 그것은 당신의 유일한 선택입니다. 직렬화를 수행하려면 코드를 생성해야하므로 직렬화 할 클래스를 직렬화 할 수있는 클래스를 알려야합니다.

기린이 ixmlserializable을 구현하는 데 도망 갈 수 있다는 것은이 글을 쓰는 동안 저를 강타했습니다.

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

mywebservice라는 웹 참조가 있다고 가정 해 봅시다. 그러면 전화 수업이 있습니다 MyWebService.Mammal. 이 클래스에 멤버를 추가하려면 다음과 같은 새 소스 파일을 작성하기 만하면됩니다.

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

웹 서비스에서 메소드를 호출 할 때 Mammal, 웹 참조 코드는 "개선 된"포유류 클래스의 새 인스턴스를 생성하고 와이어의 XML에서 인스턴스로 값을 복사합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top