Search code examples
c#web-servicesinheritanceasmx

WebService, WebMethod and Inheritance


In a Web Service context, I have the following class which inherit from the class Mammal. The Mammal class is defined in a proxy. I cannot change the definition of that class. Because I need to add some methods to the class Mammal on the client side, I inherited Mammal and created Giraffe.

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

When I call a WebMethod which expect an object of type Mammal, I get the following exception telling me that Giraffe isn't expected.

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

Is there a workaround that? I cannot really add the XmlInclude...


Solution

  • To add methods, you should be using partial classes. Try adding a second class file with (in the right namespace etc):

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

    The partial keyword tells the compiler to allow the class to be split over multiple files - ideal for code-generation scenarios. It does, however, demand the partial keyword in every file; the members are simply combined (except for partial methods in C# 3.0 which have their own subtle behaviour). I hope that wsdl.exe (or whatever) includes this!