2011-01-06 12 views
0

Ich benutze einen WCF-Service.WCF: ServiceHost Problem (zwischengespeicherte Adressen?)

Es funktioniert gut, und wenn ich eine verbotene IP verwende, zeigt es mir eine Nachricht. Aber wenn ich die IP in meinem Textfeld auf die richtige IP ändern, wird es wieder die TCP-Ausnahme fangen, mit der OLD IP ... Die IP-Zeichenfolge in der Textbox ist die richtige und alle Variablen enthält die richtige IP .. .

Die Ausnahme:

Communication TCP-Fehler (10049: Die angeforderte Adresse ist in diesem Kontext ungültig) beim Lauschen am IP-Endpunkt = 192.168.178. : 7997.

Sollte 192.168.178 sein. und nach der IP in der Textbox zu korrigieren und dem Neustart des Servers i die gleiche Ausnahme mit der alten IP bekommen ...

Hier ist meine Methode: schaffe ich alle Ressourcen neu in dieser Methode. Nur der ServiceHost-Host; Die Variable wird außerhalb der Methode gespeichert und ich habe versucht, sie vor dem Start oder nach der Ausnahme auf Null zu setzen.

Configure Host:

private void MenuItemServerStart_Click(object sender, RoutedEventArgs e) 
     { 
      **[ omitted ]** 

      //Define base addresses so all 
      //endPoints can go under it 

      Uri tcpAdrs = new Uri("net.tcp://" + 
       textBoxLocalIP.Text.ToString() + ":" + 
       textBoxPort.Text.ToString() + "/WPFHost/"); 

      Uri httpAdrs = new Uri("http://" + 
       textBoxLocalIP.Text.ToString() + ":" + 
       (int.Parse(textBoxPort.Text.ToString()) + 1).ToString() + 
       "/WPFHost/"); 

      Uri[] baseAdresses = { tcpAdrs, httpAdrs }; 

      try 
      { 
       host = new ServiceHost(typeof(ChatService.ChatService), baseAdresses); 
      } 
      catch (TargetInvocationException ex) 
      { 
       if (ex.InnerException != null) 
       { 
        **[ omitted ]** 
       } 

       return; 
      } 
      catch (Exception) 
      { 
       **[ omitted ]** 
      } 

      NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.None, true); 
      //Updated: to enable file transefer of 64 MB 
      tcpBinding.MaxBufferPoolSize = (int)67108864; 
      tcpBinding.MaxBufferSize = 67108864; 
      tcpBinding.MaxReceivedMessageSize = (int)67108864; 
      tcpBinding.TransferMode = TransferMode.Buffered; 
      tcpBinding.ReaderQuotas.MaxArrayLength = 67108864; 
      tcpBinding.ReaderQuotas.MaxBytesPerRead = 67108864; 
      tcpBinding.ReaderQuotas.MaxStringContentLength = 67108864; 
      tcpBinding.MaxConnections = 100; 

      **[ omitted ]** 

      host.AddServiceEndpoint(typeof(ChatService.IChatService), 
            tcpBinding, "tcp"); 

      //Define Metadata endPoint, So we can 
      //publish information about the service 
      ServiceMetadataBehavior mBehave = 
          new ServiceMetadataBehavior(); 
      host.Description.Behaviors.Add(mBehave); 

      host.AddServiceEndpoint(typeof(IMetadataExchange), 
       MetadataExchangeBindings.CreateMexTcpBinding(), 
       "net.tcp://" + textBoxLocalIP.Text.ToString() + ":" + 
       (int.Parse(textBoxPort.Text.ToString()) - 1).ToString() + 
       "/WPFHost/mex"); 

Starten Host (Exception):

  try 
      { 
       **host.Open();** **//Exception here !!!** 
      } 
      catch (Exception ex) 
      { 
       **[ omitted ]** 
      } 
      finally 
      { 
       if (host.State == CommunicationState.Opened) 
       { 
        ((StatusBarItem)statusBar1.Items.GetItemAt(0)).Content = "Gestartet"; 
        MenuItemServerStop.IsEnabled = true; 
       } 
      } 

     } 
+0

Es gibt eine Menge Code hier zu lesen - es wäre toll, wenn Sie das Problem isolieren könnten, so dass Sie nur 5-20 Zeilen Code schreiben müssen. Warum machst du auch 'Text.ToString()'? Text ist eine Zeichenfolge. –

+0

Im ersten Codeblock mache ich Konfigurations-Sachen und im zweiten öffne ich die Host-Verbindung. Da bekomme ich die Ausnahme. Ich kenne es eine Menge Code, aber ich weiß nicht, ob ich in der Konfiguration Fehler gemacht habe. host.open() gibt die Exception aus, aber die IP in der Exceptionnachricht ist alt. Aber ich erschaffe immer einen neuen Host und andere Objekte. – user437899

+0

@ user437899: Haben Sie nach dem Zuweisen von 'host = new ServiceHost' einen Fehler behoben und sehen Sie, ob die IP tatsächlich konfiguriert wurde? Oder vielleicht sprang der Uri davon ab, dass ihm ein Textfeld zugewiesen wurde? –

Antwort

0

I eine Ahnung haben, dass es einen statischen Zustand mit der Kanallaufzeit-Infrastruktur für HTTP Bindings zugeordnet sein kann, die unterhält Details zu HTTP-Listenern, die vom Service Uri eingegeben wurden. Wenn Sie ServiceHost-Instanzen, die auf Open zugreifen, nicht ordnungsgemäß abbauen, bleiben die alten Details möglicherweise in diesem statischen Status registriert.

Was passiert in Ihrem Catch-Block nach dem Aufruf an host.Open()? Wenn Sie die Instanzen host.Abort() und host.Dispose() nicht anrufen, die Open ausgelöst haben, ist dies möglicherweise das Problem.

+0

Hallo Chris, ich habe es versucht Host.Abort(). Dies führt dazu, dass der Host in den geschlossenen Zustand gelangt. host.Dispose() ist keine Methode von ServiceHost (http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehost_methods.aspx) Ich muss folgendes verwenden: ((IDisposable) host) .Dispose (); (Informationen von: http: // social.msdn.microsoft.com/forums/en-US/wcf/thread/c7c83c6d-37a9-45a9-8037-05754aab65fd) Aber dies half doesent. Das TCP-IP ist immer noch beschädigt. (Ich habe auch versucht, Host = null, aber keinen Effekt) – user437899

Verwandte Themen