Код сокета ASP.NET UDP работает в разработке, но не в производстве на IIS - PullRequest
3 голосов
/ 15 декабря 2009

У меня есть следующий прослушиватель UDP-трансляции, работающий как статический компонент в отдельном потоке в веб-приложении ASP.NET. Почему я это сделал, действительно, неважно, но причина, по которой это не сработает при развертывании, сбивает меня с толку. У меня есть несколько консольных приложений, отправляющих широковещательные рассылки UDP, и я протестировал и подтвердил, что этот поток и его код работают при работе в Visual Studio на веб-сервере разработки VS2005, но в тот момент, когда я скомпилировал код и развернул его на другой машине и запустить его под IIS - он перестает работать. Кроме того, он не ОШИБКА, он просто не работает.

Регистрация в log4net также, похоже, работает только в методе Init (), но не в потоке (что странно). Но я добавил несколько File.AppendAllText в поток, и он, кажется, выполняется, но, насколько я могу судить, он останавливается на строке byte[] received = mUdpClient.Receive(ref mGroupEP);

Я удостоверился, что порт открыт и протестирован в консольном приложении (которое работает), я проверил разрешения, даже сделал идентификацию по умолчанию, используя учетную запись пользователя локальной системы, но все еще ничего. Я проверил брандмауэр, проверил журнал событий - ничего. Нет ошибок, просто не работает.

Я подумал, что это может быть связано с тем, что IIS закрывает запросы System.Net в качестве меры безопасности, но я не могу найти ничего, что могло бы поддержать эту гипотезу.

  public class UDPBroadcastListener {

    #region Members

    private ILogger mLogger = NullLogger.Instance;

    private readonly int mPort;
    private UdpClient mUdpClient;
    private IPEndPoint mGroupEP;

    public event EventHandler<GenericEventArgs<byte[]>> Received;

    private Thread mThread;

    #endregion

    public UDPBroadcastListener(int port) {
      mPort = port;
    }

    public void Init() {
      try {
        Logger.WarnFormat("Setting up the UDP packet listener on port {0}", mPort);
        mGroupEP = new IPEndPoint(IPAddress.Any, mPort);
        mUdpClient = new UdpClient();
        mUdpClient.EnableBroadcast = true;
        mUdpClient.Client.SetSocketOption(SocketOptionLevel.Socket,
                                          SocketOptionName.ReuseAddress,
                                          true);
        mUdpClient.Client.Bind(mGroupEP);
        Logger.InfoFormat("Successfully bound the UDP packet listener to the the port.");

        mThread = new Thread(UpdateThread);
        mThread.IsBackground = true;
        Logger.Info("Starting the background listener thread.");
        mThread.Start();
        Logger.InfoFormat("Background listener thread started ok.");
      } catch (Exception e) {
        Logger.Error(e.Message, e);
      }
    }

    public void Close() {
      if (mThread != null) {
        mThread.Abort();
      }

      if (mUdpClient != null) {
        mUdpClient.Close();
        mUdpClient = null;
      }
    }

    public Thread Thread {
      get { return mThread; }
    }

    private void UpdateThread() {
      Logger.Info("Listener thread started.");
      while (true) {
        try {
          Logger.Info("Waiting for broadcast");

          byte[] received = mUdpClient.Receive(ref mGroupEP);

          Logger.InfoFormat("Received {0} bytes", received.Length);
          OnReceived(received);
        } catch (Exception ex) {
          Logger.Error(ex.Message, ex);
        }
      }
    }

    protected void OnReceived(byte[] pData) {
      EventHandler<GenericEventArgs<byte[]>> handler = Received;
      if (handler != null) Received(this, new GenericEventArgs<byte[]>(pData));
    }

    public virtual ILogger Logger {
      get { return mLogger; }
      set { mLogger = value; }
    }

    #region Dispose

    private bool mDisposed = false;

    public void Dispose() {
      if (mDisposed) return;

      mDisposed = true;

      Close();
    }

    ~UDPBroadcastListener() {
      Dispose();
    }

    #endregion

  }
}

Теперь я очень отчаялся. Пожалуйста помоги. (

1 Ответ

2 голосов
/ 16 декабря 2009

Вы можете попробовать исследовать с помощью TCPView (он также показывает UDP), чтобы увидеть, появляется ли что-нибудь на рабочем сервере. Прочтите « Устранение неполадок в настройках брандмауэра Windows », хотя это для XP, и я сомневаюсь, что ваш рабочий сервер - XP, но в любом случае это может быть полезно. Смотрите пример netstat.

...