我正在使用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
-
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服务。
答案 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")