我们正在使用BizTalk Server通过MSMQ发送消息。接收系统要求每条消息都将扩展属性设置为guid(作为字节数组)。 MSDN记录了MSMQMessage here和(在.NET中)here的Extension属性。
在.NET中设置扩展属性很简单:
const string messageContent = "Message content goes here";
var encodedMessageContent = new UTF8Encoding().GetBytes(messageContent);
// Create the message and set its properties:
var message = new System.Messaging.Message();
message.BodyStream = new System.IO.MemoryStream(encodedMessageContent);
message.Label = "AwesomeMessageLabel";
// Here is the key part:
message.Extension = System.Guid.NewGuid().ToByteArray();
// Bonus! Send the message to the awesome transactional queue:
const string queueUri = @"FormatName:Direct=OS:localhost\Private$\awesomeness";
using (var transaction = new System.Messaging.MessageQueueTransaction())
{
transaction.Begin();
using (var queue = new System.Messaging.MessageQueue(queueUri))
{
queue.Send(message, transaction);
}
transaction.Commit();
}
但是,BizTalk的MSMQ适配器不会将消息扩展显示为可以设置的内容(请参阅list of adapter properties on MSDN)。我还反编译了BizTalk 2013附带的Microsoft.BizTalk.Adapter.MSMQ.MsmqAdapter程序集,并且找不到对扩展属性的引用。
如何设置BizTalk发送的MSMQ消息的扩展名?如果可能的话,我宁愿不必创建自定义适配器,因为这需要大量的开销和持续的维护。
答案 0 :(得分:3)
你看到这篇文章了吗? http://msdn.microsoft.com/en-us/library/aa560725.aspx
本文介绍了如何以编程方式设置MSMQ接收位置;此外,它公开了对可能必需但默认BizTalk适配器未显示的辅助属性的访问 - (例如,扩展)
ManagementClass objReceiveLocationClass =
new ManagementClass(
"root\\MicrosoftBizTalkServer",
"MSBTS_ReceiveLocation",
null);
// Create an instance of the member of the class
ManagementObject objReceiveLocation =
objReceiveLocationClass.CreateInstance();
// Fill in the properties
objReceiveLocation["Name"] = name;
objReceiveLocation["ReceivePortName"] = port;
objReceiveLocation["AdapterName"] = adapterName;
objReceiveLocation["HostName"] = hostName;
objReceiveLocation["PipelineName"] = pipeline;
objReceiveLocation["CustomCfg"] = customCfg;
objReceiveLocation["IsDisabled"] = true;
objReceiveLocation["InBoundTransportURL"] = inboundTransport;
// Put the options -- creates the receive location
objReceiveLocation.Put(options);
修改强>
将BizTalk MSMQ适配器代码反编译为接口级别后,我没有看到使用默认适配器执行此操作的方法。适配器在密封时不能伸展。
我发现的唯一其他选项是
修改强> (你不应该设置扩展属性的原因)
Extension属性用于将大型邮件链接在一起,如果邮件总大小超过4MB,则会在传输中将其分段。这是在封面下完成的,如果规避可能会导致大邮件的损坏。
要参与大型邮件交换,邮件排队计算机必须安装Mqrtlarge.dll文件,并且邮件排队应用程序应使用加载项API。否则,完整的消息将被分段。