MSMQ服务没有读取队列

时间:2012-10-12 10:25:02

标签: c# .net msmq

我正在使用MSMQ Web服务从队列中读取数据并将其存储在数据库中。目前我正在使用Visual Studio 2010运行该服务(这是问题吗?)。代码片段如下。

合同

[ServiceContract]
public interface IService1
{
    [OperationContract(IsOneWay = true,Action="*")]
    void DOWork(MsmqMessage<Param> p);
}

实施

public class Service1:IService1
{
    [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
    public void DoWork(Param p)
    {
        new Service1BL().DoWork(p);
    }
}

配置

<service name="NameSpace.Service1" behaviorConfiguration="MSMQServiceBehavior">
                <endpoint address="net.msmq://localhost/private/Service1" binding="netMsmqBinding" bindingConfiguration="PoisonBinding" contract="IService1"/>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>

<behavior name="MSMQServiceBehavior">
    <serviceDebug includeExceptionDetailInFaults="true"/>
    <serviceMetadata httpGetEnabled="True"/>
   </behavior>

<netMsmqBinding>
                <binding name="PoisonBinding" receiveRetryCount="1" maxRetryCycles="5" retryCycleDelay="00:00:05" receiveErrorHandling="Fault">
                    <security mode="None"/>
                </binding>
            </netMsmqBinding>

其他信息

  • 我尝试过不同的队列名称。喜欢。\ Private $ \ Service1和 \私人$ \ Service1.svc

    • 消息队列,消息队列触发器,Net.Msmq Listner适配器和WAS服务正在运行
    • 我明确地将消息插入队列

-

MessageQueue queue = new MessageQueue(@".\private$\service1");
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
   queue.Send(p, MessageQueueTransactionType.Single);
   queue.Close();
   scope.Complete();
}

原因是,我从另一个调用MSMQ Web服务 网络服务。当我调用MSMQ服务时,它不是将消息插入队列,而是调用MSMQ服务。

2 个答案:

答案 0 :(得分:4)

检查队列名称格式的拼写。

而不是

MessageQueue queue = new MessageQueue(@".\private$\service1");

你应该试试这个:

MessageQueue queue = new MessageQueue(@"FormatName:DIRECT=OS:YOURMACHINENAME\private$\service1");

...当然,YOURMACHINENAME需要用保存队列的机器的名称代替。 : - )

请注意,第一部分区分大小写

答案 1 :(得分:1)

我相信这也会起作用(将单个反斜杠更改为双反斜杠)。而且您不需要使用机器名称(因此当您将其从本地盒子移动到任何地方时,您无需更改代码)。

MessageQueue queue = new MessageQueue(@".\\private$\\service1")