发送 Microsoft.Azure.ServiceBus 消息到 BizTalk 2013 WCF-Custom

Send Microsoft.Azure.ServiceBus Message to BizTalk 2013 WCF-Custom

我需要通过 Azure 服务总线将消息从 .NET Core 应用程序发送到 BizTalk 2013。我在 BizTalk 上配置了 WCF 自定义接收端口,但在接收消息时出现以下错误:

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>"));

有没有办法在 BizTalk 2013 中正确序列化消息以供 WCF 接收?

我想通了。

对于需要通过 Azure 服务总线使用 Microsoft.Azure.ServiceBus 消息发送到 BizTalk 2013 WCF 自定义接收端口的任何人。

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";

这会以正确的 SOAP 格式包装 Xml。请注意,SOAP 信封中嵌入的 "to" 是必需的(我发现使用 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();
    }
}