2011-05-25 131 views
0

我有一个WCF程序正在通过MSMQ进行通信。 出于某种原因,几条消息正在多次处理,原因不明。没有错误被抛出,我已经确认应用程序进入和退出operationBehaivior,没有任何错误被抛出。多次处理WCF MSMQ消息

例如,我会通过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消息有一个中止计数> 0或放在重试队列,但是,我从来没有收到一个错误,为什么这发生。

任何想法,为什么会发生这将是非常感激。

+0

事实证明,这是由于WCF绑定超时太短造成的。一旦我增加了客户端和服务器的超时时间,它就开始工作。 我仍然困惑的一点是,在客户端或服务器上没有指出这个问题的错误。任何想法为什么这不会抛出一个错误? – Summit 2011-05-25 23:22:47

回答

3

您发现您的问题是超出了绑定超时时间,并且您问为什么在您的客户端或服务代码中没有看到任何异常。以下是对此的探索:

客户端方式,消息是一种方式,并已成功传递到队列。从客户的角度来看,这一切都很重要。客户端永远不会看到在服务器端处理消息时出现异常。

在服务方面,您没有在代码中看到异常,因为超时是在WCF运行时级别处理的。你的代码正常完成它的执行(WCF不会中止正在执行的线程或任何东西),但是就WCF运行时而言,它耗时过长,因此消息传递需要再次重试。也就是说,您绝对会在事件日志中看到错误,并且如果启用,则会显示指示发生超时的服务跟踪日志。

+0

感谢您的信息。我显然以前没有看到你的评论,但你的解释是有道理的,我感谢你的帮助。 – Summit 2011-06-14 22:31:17