wcf - 将 Microsoft.Azure.ServiceBus 消息发送到 BizTalk 2013 WCF-Custom
问题描述
我需要通过 Azure 服务总线将消息从 .NET Core 应用程序发送到 BizTalk 2013。我在 BizTalk 上配置了 WCF 自定义接收端口,但在收到消息时出现以下错误:
适配器“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>"));
有没有办法正确序列化消息以在 BizTalk 2013 中由 WCF 接收?
解决方案
我想到了。
对于需要使用 Microsoft.Azure.ServiceBus 消息通过 Azure 服务总线向 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();
}
}
推荐阅读
- javascript - 电子邮件正则表达式
- xquery - eXist-db / xquery 将输出序列化为 csv
- database - Yugabyte DB 中的静态加密如何工作?
- python - 使用 django-python3-ldap 查找安全组的用户
- ms-access - 在报表中显示访问查询结果
- mysql - 转换 SQL 日期时间格式(MySQL 到 SQL)
- c - C 函数优化
- java - 哪一个更适合低延迟 Java 应用程序?弹簧靴还是只是弹簧?
- indexeddb - 使用索引数据库在现有数据库中动态创建对象存储
- azure - 如何通过扩展将 azure vm 加入到本地域?