Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多次处理WCF MSMQ消息_C#_Wcf_Msmq - Fatal编程技术网

C# 多次处理WCF MSMQ消息

C# 多次处理WCF MSMQ消息,c#,wcf,msmq,C#,Wcf,Msmq,我有一个WCF计划,正在通过MSMQ与之沟通。 出于某种原因,一些消息被多次处理,但没有明显的原因。没有抛出错误,我已经确认应用程序进入和退出OperationBehavior,并且没有抛出任何错误 例如,我将通过MSMQ发送一条消息,应用程序将接收并成功处理该消息,然后出于某种原因再次重新处理该消息(有时多次,有时不重新处理) 以下是正在定义的相关行为和合同: [ServiceContract] public interface IApp { [OperationContract(I

我有一个WCF计划,正在通过MSMQ与之沟通。 出于某种原因,一些消息被多次处理,但没有明显的原因。没有抛出错误,我已经确认应用程序进入和退出OperationBehavior,并且没有抛出任何错误

例如,我将通过MSMQ发送一条消息,应用程序将接收并成功处理该消息,然后出于某种原因再次重新处理该消息(有时多次,有时不重新处理)

以下是正在定义的相关行为和合同:

[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)
      {
      }



    }
[服务合同]
公共接口IApp
{
[运营合同(IsOneWay=true)]
作废ProcessMessage(列表appInfo);
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
公共类ProcessInfo:IApp
{
[操作行为(TransactionScopeRequired=true,TransactionAutoComplete=true)]
public void ProcessMessage(列表appInfo)
{
尝试
{
应用程序逻辑
}
捕获(例外e)
{
}
}
看起来多次处理的MSMQ消息有一个中止计数>0或被放入重试队列,但是,我从未收到关于为什么会发生这种情况的错误


任何关于为什么会发生这种情况的想法都将不胜感激。

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

就客户端而言,消息是单向的,并且已成功传递到队列。从客户端的角度来看,这就是最重要的。客户端永远不会看到在服务器端处理消息时出现异常


就服务而言,您在代码中没有看到异常,因为超时是在WCF运行时级别处理的。您的代码正常完成其执行(WCF不会中止正在执行的线程或任何操作),但就WCF运行时而言,它花费的时间太长,因此需要再次重试消息传递。也就是说,您肯定会在事件日志中看到错误,如果启用,则服务跟踪日志会指示超时发生。

您发现问题在于绑定超时被超过,并且询问您为什么在客户端或服务代码中没有看到任何异常。以下是对此的解释:

就客户端而言,消息是单向的,并且已成功传递到队列。从客户端的角度来看,这就是最重要的。客户端永远不会看到在服务器端处理消息时出现异常


就服务而言,您在代码中没有看到异常,因为超时是在WCF运行时级别处理的。您的代码正常完成其执行(WCF不会中止正在执行的线程或任何操作),但就WCF运行时而言,它花费的时间太长,因此需要再次重试消息传递。也就是说,您肯定会在事件日志中看到错误,如果启用,则在服务跟踪日志中会看到错误,表明发生了超时。

结果表明,这是由WCF绑定超时太短造成的。Once我增加了客户端和服务器上的超时,它开始工作得很好。我仍然感到困惑的一点是,没有在客户端或服务器上抛出表明此问题的错误。知道为什么这不会抛出错误吗?原来这是由WCF绑定超时太短引起的。once我增加了客户端和服务器上的超时,它开始工作得很好。我仍然感到困惑的一点是,客户端或服务器上没有抛出表明此问题的错误。你知道为什么这不会抛出错误吗?谢谢你提供的信息。我显然以前没有看到你的评论,但你的e解释是有道理的,我感谢你的帮助。谢谢你提供的信息。我之前显然没有看到你的评论,但你的解释是有道理的,我感谢你的帮助。