Рабочая роль Azure TCPListener, получающая неизвестные соединения

Я написал рабочую роль Azure, которая настраивает TCPListener и получает сообщения. Эти сообщения затем направляются в разные очереди служебной шины в зависимости от их содержимого. Код рабочей роли ниже:

private async Task RunAsync(CancellationToken cancellationToken)
{
    TcpListener listener;
    IPEndPoint ipEndPoint;

    ipEndPoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["MainEndpoint"].IPEndpoint;
    listener = new TcpListener(ipEndPoint) { ExclusiveAddressUse = false };
    listener.Start();

    _log.Info($"Created and started listener on {ipEndPoint.Address}:{ipEndPoint.Port}");

    while (!cancellationToken.IsCancellationRequested)
    {
        listener.BeginAcceptTcpClient(AsyncMessageHandler, listener);
        _connectionWaitHandle.WaitOne();
    }
}

private void AsyncMessageHandler(IAsyncResult result)
{
    byte[] bytes = new byte[0];
    try
    {
        _log.Debug("Session initiated");

        var listener = (TcpListener)result.AsyncState;
        var client = listener.EndAcceptTcpClient(result);

        _connectionWaitHandle.Set();

        var netStream = client.GetStream();
        bytes = new byte[short.MaxValue];
        netStream.Read(bytes, 0, bytes.Length);
        client.Close();
    }
    catch (Exception ex)
    {
        _log.Warn("An error occurred receiving a message", ex);
    }

    // Do stuff with message
}

На моей машине для разработки все работает как положено; сообщения принимаются, когда я отправляю их с помощью консольного приложения, а другие сообщения не принимаются.

Однако в Azure (Classic Cloud Service) из журналов видно, что мы получаем соединения, которые не были инициированы нами. Эти соединения приводят к исключению "соединение принудительно закрыто удаленным хостом", когда мы пытаемся прочитать из потока:

netStream.Read(bytes, 0, bytes.Length);
  • Может ли это быть что-то в архитектуре Azure, которая отслеживает службу, чтобы убедиться, что она прослушивает порт, настроенный в конфигурации конечной точки?

  • Есть ли способ определить эти связи? В настоящее время я завернул код в try/catch, но я не уверен, что это лучший способ сделать это.

Любой совет будет принята с благодарностью!

0 ответов

Другие вопросы по тегам