2016-04-11 33 views
0

Ich versuche, One Way-Kommunikation mit WCF-Dienst (NetTcpBinding) zu erstellen, aber es scheint nicht zu funktionieren.OneWay-Kommunikation mit NetTcpBinding mit C#

Schnittstelle:

[ServiceKnownType(typeof(ProcessParameter))] 
[ServiceKnownType(typeof(string))] 
[ServiceContract] 
public interface IExecServiceHost 
{ 
    [OperationContract(IsOneWay = true)] 
    void ExecBPWithPP(ISysObject _caller, UserEntity _currentUser, string _bpName, IProcessParameter _parameter, string _afterBP); 
    [OperationContract(IsOneWay = true)] 
    void ExecBPWithNVC(ISysObject _caller, UserEntity _currentUser, string _bpName, Dictionary<string, string> _parameter, string _afterBP); 
} 

Service:

Uri[] serviceURL = new Uri[] { new Uri(ExecBPEndPointURL) }; 
ServiceHost host; 

host = new ServiceHost(typeof(ExecServiceHost), serviceURL); 
host.AddServiceEndpoint(typeof(IExecServiceHost), new NetTcpBinding(), "ExecBP"); 
host.Open(); 
Console.ReadKey(); 
host.Close(); 

Auftraggeber:

using(ChannelFactory<IExecServiceHost> httpFactory = new ChannelFactory<IExecServiceHost>(
    new NetTcpBinding(), 
    new EndpointAddress(ExecBPEndPointURL))) 
{ 
    IExecServiceHost httpProxy = httpFactory.CreateChannel(); 

    Dictionary<string, string> serviceBPParam = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); 

    foreach(string key in _parameter.Keys) 
     serviceBPParam.Add(key, _parameter[key]); 

    httpProxy.ExecBPWithNVC(_caller, _currentUser, _bpName, serviceBPParam, _afterBP); 
    httpFactory.Close(); 
} 

Wenn ich WCF-Client von ASP.net Seite nenne es bis Abschluss des Prozesses warten. Bitte hilf mir, was ich vermisse. Außerdem verwende ich bis jetzt keine Konfiguration für Service/Endpunkt.

In einer Hinsicht Kommunikation wcf Client soll nicht auf den Server warten, um die Ausführung abzuschließen. Das ist das Hauptproblem.

+0

Irgendwelche Fehlermeldung oder irgendetwas? –

+0

Tom, es geht nicht um Fehler. Aber WCF-Client sollte nicht warten, wenn ich isOneWay = true habe. Aber mit dem obigen Code wartet der WCF-Client, bis der Server antwortet. –

Antwort

1

Sie verwirren Einwegrufe mit asynchronen Anrufen.

Mit Async führt der Client den Anruf aus, aber die Steuerung kehrt sofort zurück und alle Antworten werden über den Rückruf abgewickelt. Der Thread wartet nicht auf die Antwort. Das ist das Verhalten, das Sie erwarten zu sehen, denke ich.

Mit Einweg, wird der Dienst eine Antwort außer dem http 200 nicht zurückgeben, und dies ist unabhängig von irgendwelchen internen Statusänderungen als Ergebnis der Ausführung des Anrufbehandlungscodes. Der Client blockiert jedoch weiterhin, bis er die 200 empfängt, was unter Last noch lange dauern kann.

Darüber hinaus, wenn die Verbindung fehlschlägt der Client-Kanal weiterhin Fehler, so dass, auch wenn es in eine Richtung ist, müssen Sie diese Art von Fehlern auf dem Client weiterhin behandeln.

Siehe here für mehr:

Es ist wichtig zu erkennen, dass während einig Einweg Anwendungen zurückkehren sobald die abgehenden Daten an die Netzwerkverbindung geschrieben wird, in mehrere Szenarien der Umsetzung eines Bindung oder eines Dienstes kann bewirken, dass ein WCF-Client mit unidirektionalen Operationen blockiert. In WCF-Client Anwendungen wird das WCF-Clientobjekt erst zurückgegeben, wenn die ausgehenden Daten in die Netzwerkverbindung geschrieben wurden. Dies gilt für alle Nachrichtenaustauschmuster, einschließlich Ein-Weg-Operationen; Das bedeutet , dass jedes Problem beim Schreiben der Daten auf den Transport verhindert, dass der Client zurückkehrt. Abhängig von dem Problem könnte das Ergebnis eine Ausnahme oder eine Verzögerung beim Senden von Nachrichten an den Dienst sein.

+0

Okay, lass mich Async versuchen. Ich werde Sie aktualisieren, sobald ich es implementiert habe. –

Verwandte Themen