2011-01-02 7 views
1

Ich habe ein wirklich seltsames Problem erlebt. Ich erstelle eine stark verteilte Anwendung, bei der jede Anwendungsinstanz entweder ein Host und/oder ein Client für einen WCF-Service sein kann (sehr P2P-ähnlich). Alles funktioniert gut, solange der Client und der Zielhost (womit ich meine die App, nicht der Host, da derzeit alles auf einem einzigen Computer läuft (also keine Firewall-Probleme etc.)) NICHT identisch sind. Wenn sie gleich sind, hängt die App genau 1 Minute und löst dann eine TimeoutException aus. WCF-Logging hat nichts hilfreiches hervorgebracht. Hier ist eine kleine App, die das Problem veranschaulicht:TimeoutException, wenn WCF Host und Client im selben Prozess sind

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     var binding = new NetTcpBinding(); 
     var baseAddress = new Uri(@"net.tcp://localhost:4000/Test"); 

     ServiceHost host = new ServiceHost(typeof(TestService), baseAddress); 
     host.AddServiceEndpoint(typeof(ITestService), binding, baseAddress); 

     var debug = host.Description.Behaviors.Find<ServiceDebugBehavior>(); 
     if (debug == null) 
      host.Description.Behaviors.Add(new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true }); 
     else 
      debug.IncludeExceptionDetailInFaults = true; 

     host.Open(); 

     var clientBinding = new NetTcpBinding(); 
     var testProxy = new TestProxy(clientBinding, new EndpointAddress(baseAddress)); 
     testProxy.Test(); 
    } 
} 

[ServiceContract] 
public interface ITestService 
{ 
    [OperationContract] 
    void Test(); 
} 

public class TestService : ITestService 
{ 
    public void Test() 
    { 
     MessageBox.Show("foo"); 
    } 
} 

public class TestProxy : ClientBase<ITestService>, ITestService 
{ 
    public TestProxy(NetTcpBinding binding, EndpointAddress remoteAddress) : 
     base(binding, remoteAddress) { } 

    public void Test() 
    { 
     Channel.Test(); 
    } 
} 

Was mache ich falsch?

Grüße, Pharao2k

+0

hatten Sie irgendwelche Konfigurationseinstellungen? –

Antwort

5

Sie setzen alles im selben Thread. Sie können keinen Client und keinen Server im selben Thread haben, zumindest nicht in dieser Art von Code.

Wenn Sie diese stattdessen tun, zum Beispiel:

ThreadPool.QueueUserWorkItem(state => 
    { 
     var clientBinding = new NetTcpBinding(); 
     var testProxy = new TestProxy(clientBinding, new EndpointAddress(baseAddress)); 
     testProxy.Test(); 
    }); 

Ihr Code sollte besser funktionieren.

PS: sogar auf der gleichen Maschine können Sie Firewall-Probleme haben - nun, das ist ein Feature, kein Problem :-).

+0

wow danke, das hat das Problem behoben. Hätte nie gedacht, dass es ein Threading-Problem ist ^^ Ich würde deine Antwort abstimmen, aber ich habe noch keine 15 Punkte xD – Pharao2k

Verwandte Themen