Отправьте сообщение Microsoft.Azure.ServiceBus в BizTalk 2013 WCF-Custom - PullRequest
0 голосов
/ 08 апреля 2019

Мне нужно отправлять сообщения из приложения .NET Core через служебную шину Azure в BizTalk 2013. Я настроил пользовательский порт получения WCF в BizTalk, но при получении сообщения появляется следующая ошибка:

Адаптер "WCF-Custom" выдал сообщение об ошибке. Подробности "System.Xml.XmlException: источник ввода неправильно отформатирован.

Я нашел примеры использования пакета Windows.Azure.ServiceBus и BrokeredMessage, но это устарело. Мне нужно использовать Microsoft.Azure.ServiceBus и объект Message.

Я пробовал много способов сериализации XML, но, похоже, ничего не работает.

Короче говоря, я создаю сообщение так:

var message = new Message(Encoding.UTF8.GetBytes("<message>Hello world</message>"));

Есть ли способ правильно сериализовать сообщение, которое будет получено WCF в BizTalk 2013?

1 Ответ

0 голосов
/ 12 апреля 2019

Я понял это.

Для всех, кому необходимо отправлять сообщения через служебную шину 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();
    }
}
...