C# MSMQ自定义消息格式

C# MSMQ自定义消息格式,c#,msmq,C#,Msmq,我想在MSMQ的消息,将有文本为例 <order><data id="5" color="blue"/></order> 我正在使用二进制格式化程序。当我检查message.BodyStream时,有一些字符不应该在那里(00,01,FF),那么我无法无误地接收此消息 这项任务似乎很简单,只需放文字即可 <order><data id="5" color="blue"/></order> 进入msmq 矿山整体重要

我想在MSMQ的消息,将有文本为例

<order><data id="5" color="blue"/></order>
我正在使用二进制格式化程序。当我检查message.BodyStream时,有一些字符不应该在那里(00,01,FF),那么我无法无误地接收此消息

这项任务似乎很简单,只需放文字即可

<order><data id="5" color="blue"/></order> 

进入msmq

矿山整体重要代码:

public static void Send()
    {
        using (message = new Message())
        {
            request req = new request("1", "blue");

                message.Recoverable = true;
                message.Body = req.ToString();
                message.Formatter = new BinaryMessageFormatter();
                using (msmq = new MessageQueue(@".\Private$\testrfid"))
                {
                    msmq.Formatter = new BinaryMessageFormatter();
                    msmq.Send(message, MessageQueueTransactionType.None);
                }
        }
    }

[Serializable]
public class request
{
    private readonly string _order;
    private readonly string _color;

    public request(string order, string color)
    {
        _order = order;
        _color = color;
    }
    public request()
    { }
    public string Order
    {
        get { return _order; }
    }
    public string Color
    {
        get { return _color; }
    }

    public override string ToString()
    {
        return string.Format(@"<request> <job order = ""{0}"" color = ""{1}"" /> </request>",_order,_color);
    }
}
publicstaticvoidsend()
{
使用(message=newmessage())
{
请求req=新请求(“1”、“蓝色”);
message.Recoverable=true;
message.Body=req.ToString();
message.Formatter=新的BinaryMessageFormatter();
使用(msmq=newmessagequeue(@.\Private$\testrfid”))
{
msmq.Formatter=新的BinaryMessageFormatter();
发送(message,MessageQueueTransactionType.None);
}
}
}
[可序列化]
公共类请求
{
私有只读字符串_顺序;
私有只读字符串\u颜色;
公共请求(字符串顺序、字符串颜色)
{
_订单=订单;
_颜色=颜色;
}
公开请求()
{ }
公共字符串秩序
{
获取{return\u order;}
}
公共字符串颜色
{
获取{return\u color;}
}
公共重写字符串ToString()
{
返回字符串。格式(@“”\u顺序,\u颜色);
}
}

你的问题一点也不清楚;只要使用BinaryMessageFormatter,就可以向MSMQ发送任何类型的消息。下面是一个例子:

string error = "Some error message I want to log";

using (MessageQueue MQ = new MessageQueue(@".\Private$\Your.Queue.Name"))
{
    BinaryMessageFormatter formatter = new BinaryMessageFormatter();
    System.Messaging.Message mqMessage = new System.Messaging.Message(error, formatter);
    MQ.Send(mqMessage, MessageQueueTransactionType.Single);
    MQ.Close();
}

我没有找到Message.Body在传递给Body的字符串之前包含这些ascii字符的原因。我只是直接填充BodyStream而不是Body,然后让它自己转换:

Message.BodyStream = new MemoryStream(Encoding.ASCII.GetBytes(string i want to put as Body))

然后,消息只是字符串,没有其他内容。

您不需要serializable类将字符串发送到消息队列

由于您使用的是BinaryMessageFormatter,因此必须首先使用文本编码器将字符串转换为字节数组,例如

message.Body = new UTF8Encoding().GetBytes(req.ToString());
我只是以UTF8为例,您可以使用任何您喜欢的编码

然后,当您从队列中读取消息时,请记住使用相同的编码来取回字符串

string myString = new UTF8Encoding().GetString(message.Body);

希望这有助于

Downvoter:不留下评论就否决投票是不礼貌的。事实上,我已经编辑了这个问题。原始表单非常模糊,这可能就是原因。使用
BinaryMessageFormatter
时,您不应该关心它的外观。当您试图将其序列化为XML时,
BinaryMessageFormatter
不会做出这样的保证。重要的是,您正在使用与编写消息相同的格式化程序来读取消息。在使用该格式化程序时,它并不意味着人类可读。我来这里是为了寻找一种强制执行消息格式的方法,但这似乎是不可能的,无论如何在任何分布式意义上都是不可能的。现在,关于您看到的额外字节,它们可能是一个BOM(字节顺序标记),它是编码的产物。例如,UTF-8应该在
EF BB BF
ï»
)之前加上前缀,因此,如果将UTF-8字节数组解码为ASCII,则将在结果的开头获得
ï»
。虽然我在
0001 FF
上找不到任何东西,但我确实相信它们代表BOM。阅读更多关于。
string myString = new UTF8Encoding().GetString(message.Body);