En utilisant BizTalk 2013r2 CU1, j'ai créé un schéma de propriété pour ma xsd entrante et déployé l'application. Lorsque je reçois un exemple de document XML à l'aide d'un pipeline standard "réception xml", je peux voir que l'élément requis est promu dans le contexte comme prévu. J'ai ensuite créé un pipeline personnalisé qui contient le composant "XML Disassembler" dans l'étape "Disassemble" et un composant personnalisé dans l'étape "Validate". Ce composant personnalisé doit lire la propriété promue à partir du contexte. Cependant, je trouve que lorsque je passe l'emplacement de réception du pipeline "xml receive" à mon pipeline personnalisé, ma propriété n'est pas promue. J'utilise le code suivant dans mon composant personnalisé pour écrire une liste d'éléments dans le contexte du message:BizTalk - Echec de la promotion des propriétés
for (int x = 0; x < contextList.CountProperties; x++)
{
contextList.ReadAt(x, out name, out nspace);
string value = contextList.Read(name, nspace).ToString();
contextItems += "Name: " + name + " - " + "Namespace: " + nspace + " - " + value + "\r\n";
if (name == _ContextPropertyName && nspace == _ContextPropertyNamespace)
promotedPropFound = true;
}
Helpers.EventLogHelper eventHelper = new EventLogHelper();
eventHelper.LogEvent(string.Format("Context items:{0}", contextItems));
if (promotedPropFound == false)
throw new Exception(string.Format("Unable to find promoted property with name[{0}] and namespace [{1}]", _ContextPropertyName, _ContextPropertyNamespace));
De la sortie dans le journal des événements, je peux voir que certaines propriétés telles que MessageType ont été promus mais mon propriété personnalisée n'a pas. Encore une fois, si je change l'emplacement de réception pour utiliser un pipeline standard «xml receive», la propriété sera promue à partir d'une copie du même document xml (je vérifie cela en arrêtant le port d'envoi d'abonnement et en visualisant le contexte de la console d'administration).
Je trouve cela très étrange puisque le même composant "désassembleur XML" est présent dans le même étage "Désassembler" des deux pipelines, avec la même configuration (par défaut). Je commence à penser qu'il y a peut-être un problème avec 2013r2CU1 - quelqu'un d'autre a-t-il rencontré la même chose?
Merci pour votre réponse détaillée Gary, je pense que vous avez peut-être raison. Mon problème maintenant est de savoir comment câbler ça. Autant que je puisse voir, le délégué AfterLastReadEvent n'accepte pas le contexte de pipeline - auquel je dois pouvoir accéder. Je n'ai pas beaucoup d'expérience avec les délégués - savez-vous s'il est possible de passer le contexte du pipeline lorsque l'événement est soulevé? –
@RobBowman Oui c'est possible. J'ai mis à jour ma réponse pour cela. Je suppose que vous voulez passer le contexte du message plutôt que le contexte du pipeline. –
Merci pour la mise à jour Gary. Désolé, cela me prend tellement de temps mais actuellement je n'ai que 20 minutes chaque matin pour travailler dessus. Connaissez-vous un lien vers un exemple d'utilisation d'un EventingReadStream? Je n'ai pas réussi à en trouver un. Dans mon événement "DoSomething" j'ai maintenant le code qui exécute la carte requise. Mon problème maintenant est que je ne sais pas comment l'assigner au flux. Devrais-je transmettre le flux en tant que paramètre ref à l'événement, alors toute mise à jour le fera entrer dans BizTalk? –