Мне нужно отправлять сообщения из приложения .NET Core через служебную шину Azure в BizTalk 2013. Я настроил настраиваемый порт получения WCF в BizTalk, но при получении сообщения появляется следующая ошибка:
The adapter "WCF-Custom" raised an error message. Details "System.Xml.XmlException: The input source is not correctly formatted.
Я нашел примеры с использованием пакета Windows.Azure.ServiceBus и BrokeredMessage, но это устарело. Мне нужно использовать Microsoft.Azure.ServiceBus и объект Message.
Я пробовал много способов сериализации XML, но ничего не работает.
Короче говоря, я создаю сообщение следующим образом:
var message = new Message(Encoding.UTF8.GetBytes("<message>Hello world</message>"));
Есть ли способ правильно сериализовать сообщение для получения WCF в BizTalk 2013?
Я понял.
Для всех, кому необходимо отправлять сообщения через служебную шину Azure с помощью сообщения Microsoft.Azure.ServiceBus на порт получения BizTalk 2013 WCF-Custom.
var toAddress = "sb://yourbusname.servicebus.windows.net/yourqueuename";
var bodyXml = SerializeToString(yourSerializableObject); //
var soapXmlString = string.Format(@"<s:Envelope xmlns:s = ""http://www.w3.org/2003/05/soap-envelope"" xmlns:a = ""http://www.w3.org/2005/08/addressing""><s:Header><a:Action s:mustUnderstand = ""1"">*</a:Action><a:To s:mustUnderstand = ""1"">{0}</a:To></s:Header><s:Body>{1}</s:Body></s:Envelope>",
toAddress, bodyXml);
var content = Encoding.UTF8.GetBytes(soapXmlString);
var message = new Message { Body = content };
message.ContentType = "application/soap+msbin1";
Это упаковывает Xml в правильный формат SOAP. Обратите внимание, что "to", встроенный в конверт SOAP, необходим (я обнаружил, что это не работает с использованием message.To).
Для полноты это метод сериализации (для чистого xml):
public string SerializeToString<T>(T value)
{
var emptyNamespaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
var serializer = new XmlSerializer(value.GetType());
var settings = new XmlWriterSettings
{
Indent = false,
OmitXmlDeclaration = true
};
using (var stream = new StringWriter())
using (var writer = XmlWriter.Create(stream, settings))
{
serializer.Serialize(writer, value, emptyNamespaces);
return stream.ToString();
}
}