2

我正在使用 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 和 .\Private$\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();
}

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

4

2 回答 2

4

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

代替

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

你应该试试这个:

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

... 当然,其中 YOURMACHINENAME 需要替换为保存队列的机器的名称。:-)

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

于 2012-10-15T12:16:04.203 回答
1

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

MessageQueue queue = new MessageQueue(@".\\private$\\service1")
于 2012-10-17T21:25:31.060 回答