2016-04-22 65 views
1

更新所以,我有一個非常簡單的WCF客戶端 - 服務器應用程序。問題是,該服務從客戶端獲取消息,並且它還接收待處理的消息請求。但是,它不會將消息返回給客戶端。相反,它顯示了該部分: 未決的消息不包含鍵{ID}雖然ID是罰款字典是不是在WCF服務

private Dictionary<int, List<Message>> pendingMessages = 
    new Dictionary<int, List<Message>>(); 

public IEnumerable<Message> GetMessages(int id) 
{ 
    Console.WriteLine($"New request from {id}"); 
    List<Message> messages; 

    if (!pendingMessages.ContainsKey(id)) 
    { 
     Console.WriteLine($"Pending messages does not contain key {id} "); 
     return null; 
    } 

    messages = pendingMessages[id].ToList(); 
    pendingMessages[id].Clear(); 

    foreach (var msg in messages) 
    { 
     Console.WriteLine($"Returned message: ${msg.From}=>{msg.To}:{msg.Body}"); 
    } 

    return messages; 
} 

public void SendMessage(Message msg) 
{ 
    if (!pendingMessages.ContainsKey(msg.To)) 
    { 
     pendingMessages.Add(msg.To,new List<Message>()); 
    } 

    pendingMessages[msg.To].Add(msg); 
    Console.WriteLine($"{msg.From}=>{msg.To}: {msg.Body}"); 
} 
+2

也許實例接收到「的SendMessage」請求是從實例接收到「的getMessages」請求不同?這樣說:如果這被證明是Dictionary中的一個bug,我會感到驚訝。 (話雖如此,你似乎在沒有任何同步的情況下使用它,並且請求可能會進入任何線程...考慮ConcurrentDictionary,或者添加鎖定。) –

+0

pendingMessages是如何定義的? – DoctorMick

+0

何處/如何定義pendingMessages? – ChrisF

回答

2

這是因爲其處理GetMessages實例從處理SendMessage實例不同,您存儲您的郵件在服務對象中的局部變量中,所以服務類的不同實例有不同的pendingMessages

如果你真的想爲你服務的單個實例,你應該改變你的服務行爲的所有呼叫。眼前這個屬性添加到您的服務

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

你的服務只是一個實例後用於所有來電。

如果你想知道更多閱讀this