Проблема с настройкой и запуском службы WCF - PullRequest
2 голосов
/ 11 июля 2011

У меня проблема с настройкой и запуском службы WCF.В моем приложении есть метод, который запускает службу.Примерно так

void Start(string protocol, string address, string port)
{
    host = new ServiceHost(_myService,
        new Uri(String.Format("{0}://{1}{2}/Sample", protocol, address, port)));
    //...Some configuration (bindings, behaviors, etc.)
    host.Open();
}

Пусть у моего компьютера IP 192.168.0.1.Когда я передаю параметр 'address' со значением '192.168.0.2', возникает ошибка

"A TCP error (10049: The requested address is not valid in its context.)
 occurred while listening on IP Endpoint=192.168.0.2:1234"

Это верно, потому что это не мой IP.Но после этого, если я передаю правильное значение (мой реальный IP), я получаю ту же ошибку с IP 192.168.0.2!Поэтому я не могу перенастроить и перезапустить сервер без перезапуска приложения.

Почему это происходит?Как я могу избежать такого поведения?

Ответы [ 2 ]

0 голосов
/ 27 июля 2011

Похоже, WCF кэширует объект сокета в классе ExclusiveTCPTransportManager.

Мне кажется, это хорошее решение:

public static class WCFBugWorkaround
{
    public static bool IsConnectionPossible(this ServiceHost host)
    {
        try
        {
            foreach (var baseAddress in host.BaseAddresses)
            {
                IPAddress[] ipAddresses = Dns.GetHostAddresses(baseAddress.DnsSafeHost);
                IPAddress ipAddr = ipAddresses.Where(e => e.AddressFamily == AddressFamily.InterNetwork).FirstOrDefault();

                if (ipAddr == null)
                {
                    return false;
                }

                using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                {
                    System.Net.IPEndPoint localEP = new IPEndPoint(ipAddr, baseAddress.Port);
                    s.Bind(localEP);
                }
            }
        }
        catch (Exception ex)
        {
            return false;
        }

        return true;
    }
}

ServiceHost host = ...;

...

if (host.IsConnectionPossible())
{
    host.Open();
}

Спасибо Франческе за то, что она указала мне правильное направление:)

0 голосов
/ 11 июля 2011

Я не вижу по вашему вопросу, как вы добавляете правильную конечную точку, но я подозреваю, что вы пытаетесь изменить адрес конечной точки.С помощью служб WCF вы не можете вносить изменения в адрес конечной точки после вызова

host.Open();

, поскольку в этот момент служба (если у вас нет ошибок) и принимает запросы от клиентов по указанному адресу и номеру порта.

Вам необходимо создать новый объект ServiceHost с правильным адресом конечной точки (и избавиться от старого), если вы хотите разместить службу по новому адресу.

РЕДАКТИРОВАТЬ:

Изучив пример решения, которое вы опубликовали, я нашел решение этой проблемы.Я думаю, что что-то идет не так, потому что вы используете один и тот же номер порта для обеих попыток (в примере, который я скачал, вы не указываете это, поэтому порт по умолчанию равен 808).Ошибка, с которой вы столкнулись, исчезает, если вы измените свой код следующим образом, чтобы указать другой номер порта в базовом адресе для 2-й попытки:

 try
        {
            var host2 = CreateServiceHost("localhost:5432", serviceImpl);

            Console.WriteLine("#2, config: " + host2.BaseAddresses.First().ToString());

            host2.Open();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

Кажется, что-то глючит под самим WCF, возможноуровень сокета, где порт все еще недоступен после первой ошибки с неправильным IP.

Я быстро прогуглил и нашел эту статью , где кто-то испытывал задержку в повторном использовании порта после закрытия сокета.Если вам всегда нужно использовать один и тот же номер порта, возможно, вы могли бы подождать некоторое время, пока порт снова освободится, прежде чем пытаться снова создать хост службы.

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