При разработке SOAP сервисов возникла такая проблема. Все сообщения (XML), входящие или исходящие, имеют следующую структуру
Например:
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns5:cancelBookingResponse xmlns:ns2="http://epgu.rtlabs.ru/equeue/ws/types/" xmlns:ns3="http://smev.gosuslugi.ru/rev120315" xmlns:ns4="http://www.w3.org/2004/08/xop/include" xmlns:ns5="http://epgu.rtlabs.ru/equeue/ws/"><ns3:Message><ns3:Status>RESULT</ns3:Status></ns3:Message><ns3:MessageData><ns3:AppData><ns5:bookId>710019_2</ns5:bookId><ns5:status><ns2:statusCode>201</ns2:statusCode><ns2:statusMessage>Отозвано</ns2:statusMessage></ns5:status></ns3:AppData></ns3:MessageData></ns5:cancelBookingResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
Таким образом, базовые контракты (AppDada, Message и т.д.) всегда имеют постоянный namespace. При разработке я хотел реализовать базовые классы, от которых бы уже наследовал контракты для определенных случаев.
/// <summary>
///
/// </summary>
[DataContract(Namespace = "http://epgu.rtlabs.ru/equeue/ws/")]
public class AppDataBase
{
}
[DataContract]
public class AppDataInCancelBooking : AppDataBase
{
/// <summary>
///
/// </summary>
[DataMember]
public string BookId { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
public string EsiaId { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
public string Password { get; set; }
}
Но в этом случае, непонятно как указывать namespace у DataMember’ов.
Если же вместо DataContract использовать MessageContract, то, когда мы используем экземпляр этого MessageContract в качестве MessageBodyMember, то namespace у этого MessageBodyMember почему-то не наследуется.
В общем как-то так. Если кто знает, как это лучше реализовать, прошу помочь.