WebService, WebMethod 및 상속
-
03-07-2019 - |
문제
웹 서비스 맥락에서, 나는 클래스 포유류에서 물려받는 다음 수업이 있습니다. 포유류 클래스는 프록시로 정의됩니다. 그 클래스의 정의를 변경할 수 없습니다. 클라이언트 측의 클래스 포유류에 몇 가지 방법을 추가해야하기 때문에 포유류를 물려 받고 기린을 만들었습니다.
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에서 인스턴스로 값을 복사합니다.