WCF: проблема ServiceHost (кэшированные адреса?) - PullRequest
0 голосов
/ 06 января 2011

Я использую WCF-сервис.

Он работает нормально, и если я использую запрещенный IP, он показывает мне сообщение.Но если я изменю ip в моем текстовом поле на правильный IP-адрес, он снова будет перехватывать исключение TCP со старым IP-адресом ... IP-строка в текстовом поле является корректной, и все переменные содержат правильный IP-адрес ...

Исключение:

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

Должно быть 192.168.178. 25 И после исправления IP в текстовом поле и перезапуска сервера я получаю то же исключение со старым IP ...

Вот мой метод: я создаю все ресурсы, новые в этом методе.Только хост ServiceHost;Переменная хранится вне метода, и я пытался установить ее в ноль перед запуском или после исключения.

Настройка хоста:

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 голосов
/ 06 января 2011

У меня есть догадка, что может быть какое-то статическое состояние, связанное с инфраструктурой времени выполнения канала для привязок HTTP, в которой хранятся подробности о прослушивателях HTTP, использующих службу Uri. Если вы неправильно разбираете экземпляры ServiceHost, которые вызывали Open, возможно, старые данные остаются зарегистрированными в этом статическом состоянии.

Что происходит в вашем блоке перехвата после вызова host.Open()? Если вы не вызываете host.Abort() и host.Dispose() в тех случаях, когда выбрасывается Open, это может быть проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...