У нас есть установка WCF со следующими контрактами:
[ServiceContract(
Namespace = Constants.Namespaces.HL7Namespace,
Name = Constants.Roles.ContentRequiredDocumentManagementSystem)]
// XmlSerializerFormat is needed to expose the HL7 schema fields without the "Field" suffix on each one, eg: idField
[XmlSerializerFormat]
public interface ICDARequest
{
[OperationContract(
// wsdl request action
Action = Constants.Namespaces.HL7Namespace + ":" + Constants.Interactions.RCMR_IN000029UV01 + "." + Constants.VersionType.NormativeCode + Constants.Version.InteractionVersion,
// wsdl operation name
Name = Constants.Interactions.RCMR_IN000029UV01,
// wsdl response action
ReplyAction = Constants.Namespaces.HL7Namespace + ":" + Constants.Interactions.RCMR_IN000030UV01 + "." + Constants.VersionType.NormativeCode + Constants.Version.InteractionVersion)]
SearchMessagesResponse SearchMessages(SearchMessagesRequest RCMR_IN000029UV01);
[MessageContract(
IsWrapped = false]
public class SearchMessagesResponse
{
[MessageBodyMember(
Name = State.Constants.Interactions.RCMR_IN000030UV01,
Namespace = State.Constants.Namespaces.HL7Namespace)]
public RCMR_IN000030UV01 data;
}
}
- Они основаны на классах, созданных на основе схемы HL7v3 с использованием
xsd.exe
. - Затем мы изменили схему, чтобы добавить пользовательский элемент, используя собственное пространство имен, чтобы различать его, и заново сгенерировали классы.
- это работало нормально.
Он добавил:
[System.Xml.Serialization.XmlTypeAttribute(TypeName = "BCCDX.DistributionStatus", Namespace = "urn:bccdx.ca")]
public partial class BCCDXDistributionStatus
{
[System.Xml.Serialization.XmlElementAttribute("receivedTime", Namespace = "urn:bccdx.ca", IsNullable = false)]
public TS receivedTime{...}
}
что и хотелось.
Затем в службе WCF мы можем использовать новый класс и члены:
var distStatus = new BCCDXDistributionStatus();
distStatus.receivedTime = CreateTS(locStat.MessageDownloadDate);
затем это сериализуется и отправляется по сети, выглядя так:
<distributionStatus xmlns="urn:bccdx.ca">
<receivedTime value="201702150956-0800"/>
</distributionStatus>
что почти правильно. Загвоздка связана с тем, что XML-документ не имеет ссылки на пространство имен "urn:bccdx.ca"
. Я предполагал, что он будет автоматически добавлен в корневой элемент документа при сериализации, но ошибся. Вот как это выглядит в итоге:
<RCMR_IN000030UV01 ITSVersion="XML_1.0" xmlns="urn:hl7-org:v3">
...
</RCMR_IN000030UV01>
когда то, что действительно желательно, выглядит примерно так:
<RCMR_IN000030UV01 ITSVersion="XML_1.0" xmlns="urn:hl7-org:v3" xmlns:x="urn:bccdx.ca">
...
</RCMR_IN000030UV01>
обратите внимание на urn:bccdx.ca с префиксом
Мне интересно, как, если мы вообще можем добавить более одного пространства имен с префиксами к результирующему сериализованному XML-сообщению через контракты? Я видел в Интернете намеки на переопределение сериализатора по умолчанию, но я бы не хотел. Наверняка об этом уже думали и решали раньше?
xsd.exe
для создания своих классов, вы где-то применяете[XmlSerializerFormat]
? Я не вижу этого в вопросе. - person dbc   schedule 24.02.2017XmlSerializerFormat
к исходному вопросу. - person Bensonius   schedule 24.02.2017