2016-04-22 3 views
1

Also, ich habe eine sehr einfache WCF-Client-Server-App. Die Sache ist, der Dienst erhält Nachrichten vom Client und er empfängt auch ausstehende Nachrichtenanforderungen. Es gibt jedoch keine Nachricht an den Client zurück. Stattdessen zeigt es dieser Teil: Pending Nachrichten nicht Schlüssel enthält {id} obwohl die IDWörterbuch wird nicht aktualisiert in WCF-Dienst

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

Vielleicht unterscheidet sich die Instanz, die die Anforderung "SendMessage" empfängt, von der Instanz, die die Anforderung "GetMessages" empfängt? Sagen wir es so: Ich wäre * erstaunt *, wenn sich das im Dictionary als Fehler herausstellen würde. (Nachdem Sie das gesagt haben, scheinen Sie es ohne irgendeine Art von Synchronisation zu verwenden, und Anfragen könnten in jedem Thread eingehen ... berücksichtigen Sie ConcurrentDictionary, oder fügen Sie Sperren hinzu.) –

+0

Wie ist pendingMessages definiert? – DoctorMick

+0

Wo/wie sind "pendingMessages" definiert? – ChrisF

Antwort

2

fein ist, ist es, weil die Instanz, die GetMessages Verfahren unterscheidet sich von der Instanz, die SendMessage und Sie speichern Ihre Nachrichten verarbeiten in lokaler Variable in Ihrem Service-Objekt, so unterschiedliche Instanz der Service-Klasse haben unterschiedliche pendingMessages.

Wenn Sie wirklich alle Anrufe an eine einzige Instanz Ihres Dienstes tätigen möchten, sollten Sie Ihr Dienstverhalten ändern. Fügen Sie dieses Attribut einfach Ihrem Dienst hinzu.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

Danach wird nur eine Instanz Ihres Dienstes für alle eingehenden Anrufe verwendet.

Wenn Sie mehr wissen wollen, lesen Sie this.