我有一个通过MSMQ与之通信的WCF程序。 出于某种原因,几个消息正在被处理多次,没有明显的原因。没有错误被抛出,我已经确认应用程序进入和退出operationBehaivior而不会抛出任何错误。
例如,我将通过MSMQ发送1条消息,应用程序将收到它并成功处理它,然后由于某种原因再次重新处理它(有时多次,有时没有重新处理)
以下是定义的相关行为和合同:
[ServiceContract]
public interface IApp
{
[OperationContract(IsOneWay = true)]
void ProcessMessage(List<AppData> appInfo);
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class ProcessInfo : IApp
{
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void ProcessMessage(List<AppData> appInfo)
{
try
{
app logic
}
catch(Exception e)
{
}
}
看起来多次处理的MSMQ消息具有中止计数&gt; 0或者被置于重试队列中,但是,我从未收到过关于为什么会发生这种情况的错误。
对于为什么会发生这种情况的任何想法都将非常感激。
答案 0 :(得分:3)
您发现您的问题是超出了绑定超时,并且您询问为什么您在客户端或服务代码中没有看到任何异常。以下是对此的探索:
客户端明智,消息是单向的,并且已成功传递到队列中。从客户的角度来看,这一切都很重要。客户端永远不会看到在服务器端处理消息时出现异常。
服务方面,您没有在代码中看到异常,因为超时是在WCF运行时级别处理的。您的代码正常完成其执行(WCF不会中止正在执行的线程或任何内容),但就WCF运行时而言,它花费的时间太长,因此需要再次重试消息传递。也就是说,您肯定会在事件日志中看到错误,如果启用,则会显示指示超时发生的服务跟踪日志。