2011-05-25 75 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