WCF отправляет одно и то же исключение, даже если адрес конечной точки службы действителен

У меня действительно странная проблема с WCF. Мне нужно реализовать некоторое поведение восстановления для службы WCF, если получен IP-адрес недостижимой конечной точки или служба не может выполнить привязку. Поток прост, если приложение выходит из строя при исключении при создании службы, оно завершает его и запрашивает у пользователя другой IP-адрес и выполняет еще одну попытку создания службы. (фрагмент кода ниже). Если адрес недействителен, я получаю сообщение «Ошибка TCP (10049: запрошенный адрес недействителен в своем контексте) во время прослушивания исключения IP Endpoint = .121.10.11.11», но по какой-либо причине, если я попытаюсь вторую попытку с действительный адрес У меня такое же исключение с неправильным IP-адресом из предыдущей попытки. Вот код:

ServiceHost service = null;
try
{
    Uri[] uris = { new Uri(Constants.PROTOCOL + "://" + address + ":" + port) };
    service = new ServiceHost(typeof(IRemoteService), uris);
    NetTcpBinding tcpBinding =
        WcfTcpRemoteServicesManager.LessLimitedNewNetTcpBinding(int.MaxValue,
            int.MaxValue, int.MaxValue);
    ServiceEndpoint ep = service.AddServiceEndpoint(implementedContract.FullName,
        tcpBinding, serviceName);
    var throttle =
        service.Description.Behaviors.Find<ServiceThrottlingBehavior>();
    if (throttle == null)
    {
        throttle = new ServiceThrottlingBehavior
        {
            MaxConcurrentCalls = Constants.MAX_CONCURRENT_CALLS,
            MaxConcurrentSessions = Constants.MAX_CONCURRENT_SESSIONS,
            MaxConcurrentInstances = Constants.MAX_CONCURRENT_INSTANCES
        };
        service.Description.Behaviors.Add(throttle);
    }
    service.Open();

}
catch (Exception e)
{
    _debugLog.WriteLineMessage(
        "Failed to open or create service exception. Exception message:" +
            e.Message);
    if (service!=null)
    {
        try
        {
            service.Close();
        }
        catch (Exception)
        {
            service.Abort();
            service.Close();
            throw e;
        }
    }
}

Спасибо


person ALexr111    schedule 21.01.2010    source источник


Ответы (1)


Вы перехватываете исключение e, а затем перехватываете другое исключение, но выбрасываете исходное исключение e.

Не уверен, что это ваша проблема, но это может привести к тому, что вы вернете запутанное исключение.

ИЗМЕНИТЬ

Теперь я прочитал его более внимательно.

Проблема заключается в несоответствии контекста и адреса. Я вижу, что код использует netTcpBinding:

  • Убедитесь, что адрес совпадает, каково значение CONSTANTS.Protocol?
  • Убедитесь, что в файлах конфигурации нет конфликтов.
person Shiraz Bhaiji    schedule 22.01.2010
comment
Это ожидаемое поведение, я хочу обновить верхний уровень, который здесь вызвал исключение, но изящно закрыть ServiceHost. - person ALexr111; 22.01.2010
comment
Но вы выбрасываете его только в том случае, если закрытие хоста службы генерирует исключение. Если закрытие узла службы работает, верхний уровень не получит исключение - person Shiraz Bhaiji; 22.01.2010
comment
Вы правы, ту же строку следует добавить и в верхнее исключение, но, к сожалению, исходная проблема все еще не решена. - person ALexr111; 23.01.2010
comment
Здравствуйте, Шираз. Значение CONSTANTS.Protocol: public const string PROTOCOL = net.tcp; Конфликтов в конфигурационных файлах нет. Как возможно, чтобы контекст сохранял предыдущий адрес, если возникло исключение? Если я попытаюсь изменить один действительный адрес на другой действительный, операция завершится успешно, она завершится ошибкой только после исключения. Можно ли очистить контекст на стороне сервера? - person ALexr111; 24.01.2010