通过 msmqIntegrationBinding 向 msmq 队列发送消息
Sending message to msmq queue via msmqIntegrationBinding
所以我正在尝试配置我的客户端代码以将消息发送到 MSMQ 队列。我按照此处描述的步骤进行操作:https://msdn.microsoft.com/en-us/library/ms789008(v=vs.100).aspx?cs-save-lang=1&cs-lang=csharp,我的客户端代码如下所示:
class Program
{
static void Main(string[] args)
{
var binding = new MsmqIntegrationBinding("MyMessagesBinding");
var address = new EndpointAddress(@"msmq.formatname:DIRECT = OS:.\private$\MyMessages");
var channelFactory = new ChannelFactory<IDataRelayService>(binding, address);
var channel = channelFactory.CreateChannel();
while (true)
{
var message = new MyMessage
{
Content = "this is content!!!",
Id = "random uuid"
};
var msmqWrapper = new MsmqMessage<MyMessage>(message)
{
Priority = MessagePriority.Highest
};
channel.PassMessage(msmqWrapper);
Console.WriteLine("message sent");
Console.ReadLine();
}
}
}
App.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<system.serviceModel>
<client>
<endpoint name="MyResponseEndpoint"
address="msmq.formatname:DIRECT=OS:.\private$\MyMessages"
binding="msmqIntegrationBinding"
bindingConfiguration="MyMessagesBinding"
contract="Client.IDataRelayService">
</endpoint>
</client>
<bindings>
<msmqIntegrationBinding>
<binding name="MyMessagesBinding">
<security mode="None" />
</binding>
</msmqIntegrationBinding>
</bindings>
</system.serviceModel>
</configuration>
IDataRelayService.cs:
[ServiceContract]
public interface IDataRelayService
{
[OperationContract(IsOneWay = true, Action = "*")]
void PassMessage(MsmqMessage<MyMessage> message);
}
IDataRelayServiceChannel.cs:
public interface IDataRelayServiceChannel : IDataRelayService, System.ServiceModel.IClientChannel
{
}
它编译和运行没有问题,但是当我打开 evet 查看器时,没有为 MSMQ 记录任何事件。如果我打开计算机管理工具查看队列,它会在我的队列中显示 0 条消息。我在这里做错了什么?
编辑:
我为 MSMQ 启用了事件跟踪,这是事件查看器向我显示的内容:
您的问题几乎可以肯定与权限有关。
消息发件人 运行 所属的服务帐户必须对其尝试发送到的队列具有以下 MSMQ 权限:
- 发送消息
- 获取属性
- 获取权限
如果您的发件人与您的收件人在不同的域中,您将需要将这些权限授予名为 ANONYMOUS_LOGON 的本地用户。
此外,启用 MSMQ E2E 事件日志记录:https://technet.microsoft.com/en-us/library/cc730882(v=ws.11).aspx。这应该会告诉您发生了什么。
如果您在队列的两端都有 WCF,您应该使用 netMsmqBinding 而不是 msmqIntegrationBinding。
所以我正在尝试配置我的客户端代码以将消息发送到 MSMQ 队列。我按照此处描述的步骤进行操作:https://msdn.microsoft.com/en-us/library/ms789008(v=vs.100).aspx?cs-save-lang=1&cs-lang=csharp,我的客户端代码如下所示:
class Program
{
static void Main(string[] args)
{
var binding = new MsmqIntegrationBinding("MyMessagesBinding");
var address = new EndpointAddress(@"msmq.formatname:DIRECT = OS:.\private$\MyMessages");
var channelFactory = new ChannelFactory<IDataRelayService>(binding, address);
var channel = channelFactory.CreateChannel();
while (true)
{
var message = new MyMessage
{
Content = "this is content!!!",
Id = "random uuid"
};
var msmqWrapper = new MsmqMessage<MyMessage>(message)
{
Priority = MessagePriority.Highest
};
channel.PassMessage(msmqWrapper);
Console.WriteLine("message sent");
Console.ReadLine();
}
}
}
App.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<system.serviceModel>
<client>
<endpoint name="MyResponseEndpoint"
address="msmq.formatname:DIRECT=OS:.\private$\MyMessages"
binding="msmqIntegrationBinding"
bindingConfiguration="MyMessagesBinding"
contract="Client.IDataRelayService">
</endpoint>
</client>
<bindings>
<msmqIntegrationBinding>
<binding name="MyMessagesBinding">
<security mode="None" />
</binding>
</msmqIntegrationBinding>
</bindings>
</system.serviceModel>
</configuration>
IDataRelayService.cs:
[ServiceContract]
public interface IDataRelayService
{
[OperationContract(IsOneWay = true, Action = "*")]
void PassMessage(MsmqMessage<MyMessage> message);
}
IDataRelayServiceChannel.cs:
public interface IDataRelayServiceChannel : IDataRelayService, System.ServiceModel.IClientChannel
{
}
它编译和运行没有问题,但是当我打开 evet 查看器时,没有为 MSMQ 记录任何事件。如果我打开计算机管理工具查看队列,它会在我的队列中显示 0 条消息。我在这里做错了什么?
编辑:
我为 MSMQ 启用了事件跟踪,这是事件查看器向我显示的内容:
您的问题几乎可以肯定与权限有关。
消息发件人 运行 所属的服务帐户必须对其尝试发送到的队列具有以下 MSMQ 权限:
- 发送消息
- 获取属性
- 获取权限
如果您的发件人与您的收件人在不同的域中,您将需要将这些权限授予名为 ANONYMOUS_LOGON 的本地用户。
此外,启用 MSMQ E2E 事件日志记录:https://technet.microsoft.com/en-us/library/cc730882(v=ws.11).aspx。这应该会告诉您发生了什么。
如果您在队列的两端都有 WCF,您应该使用 netMsmqBinding 而不是 msmqIntegrationBinding。