WCF net.TCP, размещенный на эмуляторе Azure — Windows 7

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

При развертывании в моей учетной записи Azure он работает нормально, но во время выполнения выдает исключение:

Соединение не может быть установлено, потому что целевая машина активно отказывается от него.

Иногда, когда я меняю номер порта, он пару раз работает нормально, но потом снова отказывается от соединения, и мне снова приходится менять номер порта...

Я сделал исключения в брандмауэре Windows, а также отключил брандмауэр, но он не работает.

Может быть, это какое-то ограничение на Windows 7? Любая помощь приветствуется. Спасибо

Изменить: я добавляю клиентский и серверный код для уточнения.

Конфигурация службы:

using (ServiceHost host = new ServiceHost(typeof(XMPPService)))
{
    string ip = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["tcpinput"].IPEndpoint.Address.ToString();
    int tcpport = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["tcpinput"].IPEndpoint.Port;
    int mexport = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["mexinput"].IPEndpoint.Port;
    ServiceMetadataBehavior metadatabehavior = new ServiceMetadataBehavior();
    host.Description.Behaviors.Add(metadatabehavior);

    ServiceDebugBehavior behavior = host.Description.Behaviors.Find<ServiceDebugBehavior>();
    ServiceThrottlingBehavior tho = new ServiceThrottlingBehavior();
    tho.MaxConcurrentCalls = 10000;
    tho.MaxConcurrentInstances = 1000;
    tho.MaxConcurrentSessions = 1000;
    host.Description.Behaviors.Add(tho);

    if (behavior == null)
    {
        host.Description.Behaviors.Add(new ServiceDebugBehavior() { IncludeExceptionDetailInFaults = true });
    }
    else
    {
        if (!behavior.IncludeExceptionDetailInFaults)
        {
            behavior.IncludeExceptionDetailInFaults = true;
        }
    }

    Binding mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();

    string mexlistenurl = string.Format("net.tcp://{0}:{1}/XMPPServiceMetaDataEndpoint", ip, mexport);
    string mexendpointurl = string.Format("net.tcp://{0}:{1}/XMPPServiceMetaDataEndpoint", ip, mexport);
    host.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, mexendpointurl, new Uri(mexlistenurl));
    NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.None);
    tcpBinding.CloseTimeout = TimeSpan.FromMinutes(2);

    tcpBinding.ReceiveTimeout = TimeSpan.FromDays(23);
    tcpBinding.OpenTimeout = TimeSpan.FromMinutes(3);
    tcpBinding.SendTimeout = TimeSpan.FromMinutes(1);
    tcpBinding.PortSharingEnabled = true;
    tcpBinding.MaxConnections = 10000;
    tcpBinding.MaxConnections = 100;
    // tcpBinding.ListenBacklog = 1000000;
    tcpBinding.ReliableSession.InactivityTimeout = TimeSpan.FromSeconds(90);
    tcpBinding.ReliableSession.Enabled = true;

    // Add the endpoint for MyService
    string listenurl = string.Format("net.tcp://{0}:{1}/ServiceEndpoint", ip, tcpport);
    string endpointurl = string.Format("net.tcp://{0}:{1}/ServiceEndpoint", ip, tcpport);
    host.AddServiceEndpoint(typeof(IXMPPService), tcpBinding, endpointurl, new Uri(listenurl));

    host.Open();

    Thread.Sleep(Timeout.Infinite);
}

Клиент:

AppService()  //private constructor
{
    client = new ServiceRef.ServiceClient();
}

Сервисный звонок:

bool isAvailable = false;

try
{
    isAvailable=client.IsAvailable(_ixo.IMBot.IMEmail, _ixo.Operator.IMClients.First().IMEmail);
}
catch
{
    if (client.InnerChannel.State == System.ServiceModel.CommunicationState.Faulted)
    {
        client.InnerChannel.Abort();
        client = new ServiceRef.ServiceClient();
    }
}

person Sebastián Odena    schedule 30.08.2012    source источник
comment
Добавьте несколько примеров кода сервера и клиента, пожалуйста   -  person Tommy Grovnes    schedule 30.08.2012
comment
вы привязаны к 127.0.0.1:XXXX? Вы никогда не должны делать этого с Windows Azure. Вместо этого вы должны взять IPEndpoint из InstanceEndpoints — msdn. microsoft.com/en-us/library/ взять из RoleEnvironment.CurrentRoleInstance.InstanceEndpoints[yourEndpointName]   -  person astaykov    schedule 30.08.2012
comment
Да астайков, я беру эндпоинты из InstanceEndpoints. Он указывает на 127.255.0.1. Это IP-адрес, который я использую от клиента. Время от времени работает.   -  person Sebastián Odena    schedule 31.08.2012
comment
Дайте своему вопросу осмысленный заголовок, а не просто список тегов.   -  person abatishchev    schedule 31.08.2012


Ответы (2)


Поскольку ваша проблема носит спорадический характер и смена порта работает некоторое время, возможно, совместное использование порта net.tcp конфликтует со службой. Поэтому, поскольку вы используете приложение WCF на основе net.tcp (в веб-роли или рабочей роли) локально, убедитесь, что службы совместного использования портов net.tcp включены для эффективной работы.

Также в коде запуска службы вы можете правильно настроить привязку к базовому IP-адресу и порту, как показано ниже:

NetTcpBinding binding = new NetTcpBinding();
binding.PortSharingEnabled = true;
// Setup other binding properties here.

// Service_NAME is the Serice Name in this project
ServiceHost host = new ServiceHost(typeof(Service_NAME)); 

//Endpoint1 is the End point name you have setup in your Windows Azure Role property
string serviceIP = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"].IPEndpoint.Address.ToString();
string servicePort = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"].IPEndpoint.Port.ToString();
// 
string address = String.Format("net.tcp://{0}:{1}/SERVICE_METHOD*", serviceIP, servicePort);
host.AddServiceEndpoint(typeof(YOUR_SERVICE_TYPE), binding, address);
host.Open();
person AvkashChauhan    schedule 30.08.2012
comment
У меня включен общий доступ к порту, и да, я использую CurrentRoleInstance для получения IP-адреса и порта. Я редактирую свой пост, чтобы добавить код - person Sebastián Odena; 31.08.2012

«Я выяснил, что происходит: IP-адрес, назначенный рабочей роли, является динамическим. Иногда это 127.255.0.0, а иногда — 127.255.0.1».

Думаю, ты совершаешь ту же ошибку, что и я. Глянь сюда:

Azure Compute Emulator: это можно ли контролировать IP отдельных экземпляров?

person Jude Fisher    schedule 31.08.2012