C#消息队列向远程MSMQ发送消息

克厃制 北京诺泽有限公司 C#工程师  2020-06-15 08:11:56
目标:通过网线连接服务器(Windows10 专业版 电脑),实现C#Winform程序(Windows 7)向服务器MSMQ的专用队列中发送消息。

1,通过网线连接两台电脑,IP地址都在统一网段 192.168.1.xxx,可以ping成功
2.两台电脑都启动了MSMQ,
3.两台电脑各自往各自的本地队列发送信息都能成功,但是A电脑往B电脑发送信息程序中成功发送了,但是该信息一直在本地的传出队列中


这是发送的代码



在服务端 专用队列的权限 都给足了,EveryOne 和AnonYmouseLogo的权限全是完全控制




IIS里默认的MSMQ页面也在。网上的博客、资料查了一堆 该设置的都设置了, 一台电脑往另一台电脑传就是等待中....
跪求大佬解惑!
...全文
300 点赞 收藏 10
写回复
10 条回复
ying1234 04月30日
发送好象也用事务发送。
回复 点赞
ying1234 04月30日
MessageQueue queue = null; public MemqTest() { InitializeComponent(); } protected override void OnStart(string[] args) { //queue = new MessageQueue(".\\Private$\\MsMqDemo"); //远程接收消息队列本机不需要安装消息队列 queue = new MessageQueue("FormatName:Direct=TCP:183.131.1.120\\Private$\\MsMqDemo"); System.Timers.Timer t = new System.Timers.Timer(); t.Interval = 1000;//1秒 t.Elapsed += new ElapsedEventHandler(ChkSvr); t.AutoReset = true;//是执行一次(false),还是一直执行(true) t.Enabled = true;//是否引发ElapsedEventHandler事件。 } private void ChkSvr(object source, ElapsedEventArgs e) { System.Timers.Timer tt = (System.Timers.Timer)source; tt.Enabled = false; queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) }); #region 事务接收 //MessageQueueTransaction trans = new MessageQueueTransaction(); //try //{ // trans.Begin(); // //Message message = queue.Peek(); // Message message = queue.Receive(trans); // if (message == null) // { // WriteLog("消息为空"); // } // string str = message.Body.ToString(); // WriteLog(str); // //queue.Receive(trans); // trans.Commit(); //} //catch (Exception ex) //{ // trans.Abort(); // WriteLog("接收消息时出错:错误信息:"+ex.Message+",详细错误:"+ex.StackTrace.ToString()); //} //finally //{ // trans.Dispose(); // tt.Enabled = true; //} #endregion try { Message message = null; using (TransactionScope trans = new TransactionScope()) { message = queue.Receive(MessageQueueTransactionType.Automatic); if (message == null) { WriteLog("消息为空"); } string str = message.Body.ToString(); WriteLog(str); trans.Complete(); } } catch(Exception exp) { WriteLog("接收消息时出错:错误信息:" + exp.Message + ",详细错误:" + exp.StackTrace.ToString()); } finally { tt.Enabled = true; } } protected override void OnStop() { if (queue != null) { queue.Close(); } } 居然还有N年前msmq的测试代码,不好意思,只找到接收的,发送的找不到了,这个是用事务接收,我记得好象用事务接收,只要数据发出去了,哪怕机器重启,数据也不会丢失。你有空试试看吧。
回复 点赞
amuie 04月28日
2计算机要加入域
回复 点赞
克厃制 2020年06月19日
跟电脑有关系, 我连的是我的笔记本,连不上,发不了消息, 昨天试着直接连服务器,竟然连通了。。。不知道为毛....这个问题等这个项目周期结束再研究吧,赶项目进度哇.......这个帖子先放着吧,各位大神有解决方案的话烦请指点一二,稍后我也会查资料解决,最后会根据指点内容结贴的。谢谢各位!
回复 点赞
失足成万古风流人物 2020年06月16日
看套接字失败那里ip 端口是啥,然后去对端netstat看端口是否有监听。或者找一下这个队列服务有没有其他日志可以看。
引用 4 楼 克厃制 的回复:
[quote=引用 2 楼 失足成万古风流人物 的回复:] 没用过。 不过应该跟程序没关系,你的程序已经将消息送到传出队列。 传出队列连接另一台电脑出错,那不是提示创建连接失败吗,重点查防火墙端口之类的。或者A到B的端口啥的是否配正确了。或者有没有权限之类的配置。 别的不知道了。
防火墙全部都已经关闭了,按照我查的资料来看,MSMQ消息队列只需要更改IP地址为同一网段就可以了,没有配置过端口号,权限已经都设置为完全控制了[/quote]
回复 点赞
克厃制 2020年06月16日
引用 1 楼 手在键盘敲很轻 的回复:
很久没玩这个队列了,你看queueName 里面的是private 这个会不会有影响?应该有public吧!


这个不会影响,private是专用队列,正常来说用户组只要有路径就可以发送过去。public是公用队列,需要在域中才能用
回复 点赞
克厃制 2020年06月16日
引用 2 楼 失足成万古风流人物 的回复:
没用过。
不过应该跟程序没关系,你的程序已经将消息送到传出队列。
传出队列连接另一台电脑出错,那不是提示创建连接失败吗,重点查防火墙端口之类的。或者A到B的端口啥的是否配正确了。或者有没有权限之类的配置。
别的不知道了。


防火墙全部都已经关闭了,按照我查的资料来看,MSMQ消息队列只需要更改IP地址为同一网段就可以了,没有配置过端口号,权限已经都设置为完全控制了
回复 点赞
以专业开发人员为伍 2020年06月16日
自己随便写个服务部署上,都方便和快捷许多倍。
回复 点赞
失足成万古风流人物 2020年06月16日
没用过。 不过应该跟程序没关系,你的程序已经将消息送到传出队列。 传出队列连接另一台电脑出错,那不是提示创建连接失败吗,重点查防火墙端口之类的。或者A到B的端口啥的是否配正确了。或者有没有权限之类的配置。 别的不知道了。
回复 点赞
手在键盘敲很轻 2020年06月16日
很久没玩这个队列了,你看queueName 里面的是private 这个会不会有影响?应该有public吧!
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告