WCF:服务主机问题(缓存地址?)

时间:2011-01-06 00:22:29

标签: wcf tcp

我使用WCF服务。

它工作正常,如果我使用禁用的IP,它会向我显示一条消息。 但是,如果我将文本框中的IP更改为正确的IP,它将再次捕获TCP异常,使用OLD IP ...文本框中的IP字符串是正确的,所有变量都包含正确的IP ...

例外:

  

CommunicationException TCP-Fehler   (10049:Die angeforderte Adresse ist   在diesemKontextungültig)beim   劳森上午   IP-Endpunkt = 192.168.178的 2 :。7997

应为192.168.178。 25 在纠正文本框中的IP并重新启动服务器后,我得到了与旧IP相同的异常......

这是我的方法: 我在这个方法中创建了所有新的资源。 只有ServiceHost主机;变量存储在方法之外,我尝试在开始之前或异常之后将其设置为null。

配置主机:

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");

启动主机(例外):

            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;
                }
            }

        }

1 个答案:

答案 0 :(得分:0)

我预感到可能存在与HTTP绑定的通道运行时基础结构相关联的静态状态,这维护了由服务Uri键入的HTTP侦听器的详细信息。如果您没有正确拆除使用Open的ServiceHost实例,则旧的详细信息可能仍会在此静态状态下注册。

调用host.Open()后,您的catch块会发生什么?如果您没有在打开Open的实例上调用host.Abort()host.Dispose(),则可能是问题所在。