我需要通过Azure Service Bus从.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>"));
有没有一种方法可以正确地序列化消息,以便WCF在BizTalk 2013中能够接收到该消息?
答案 0 :(得分:0)
我知道了。
对于需要使用Microsoft.Azure.ServiceBus消息通过Azure Service Bus发送消息到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格式。请注意,嵌入到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();
}
}