在C#
中使用Transactional MSMQ和WCF有时由于某种原因,即使前一次消息被成功处理(即没有未处理的异常或任何内容),消息也会从MSMQ重新分配。我只有1 msg放在队列中。
任何想法为什么?
当然,我也在调度msg时进行调试,但我在某些区域只有非常少量的断点,花费不超过3秒的时间查看我需要在msg的上下文中查看的内容流入系统。
重复发送的任何想法?
更新:代码:
[ServiceContract]
[ServiceKnownType(typeof(CustomMessage))]
[ServiceKnownType(typeof(MessageA))]
[ServiceKnownType(typeof(MessageB))]
public interface IMessageHandlerService
{
[OperationContract(IsOneWay = true, Action = "*")]
void ProcessMessage(MsmqMessage<CustomMessage> message);
}
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single, ReleaseServiceInstanceOnTransactionComplete = false)]
public sealed class MessageHandlerService : IMessageHandlerService
{
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void ProcessMessage(MsmqMessage<CustomMessage> message)
{
...
}
}
我的ABC:
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="IncludeExceptionDetails">
<callbackDebug includeExceptionDetailInFaults="true" />
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service name="Services.Implementation.MessageHandler.MessageHandlerService">
<endpoint address="msmq.formatname:DIRECT=OS:.\private$\msgs" binding="msmqIntegrationBinding" bindingConfiguration="MessageHandlerBinding" contract="Services.Contracts.Messages.IMessageHandlerService">
</endpoint>
</service>
</services>
<bindings>
<msmqIntegrationBinding>
<binding name="MessageHandlerBinding"
closeTimeout="00:30:00"
receiveTimeout="01:00:00"
retryCycleDelay="00:00:10"
receiveRetryCount="0"
exactlyOnce="true"
maxRetryCycles="1"
receiveErrorHandling="Move">
<security mode="None"/>
</binding>
</msmqIntegrationBinding>
</bindings>
</system.serviceModel>
我真的不明白这个问题是模糊不清的:-) 这很简单。当wcf绑定到msmq时,即使成功处理了第一条消息,有时也会调度两次相同的消息。
您还需要其他哪些细节?请告诉我们!