代码之家  ›  专栏  ›  技术社区  ›  Ash

ASP.NET UDP套接字代码在开发中工作,但在IIS上不在生产中工作

  •  3
  • Ash  · 技术社区  · 15 年前

    我在ASP.NET Web应用程序的单独线程中有以下UDP广播侦听器作为静态组件运行。我为什么要这样做是真的,不重要的,但这在部署时不起作用的原因让我困惑。我确实有几个控制台应用程序发送UDP广播,并且我已经对这个线程及其代码进行了编码测试并确认了它在VS2005开发Web服务器上的Visual Studio下运行时的工作状态,但是当我编译代码并将其部署到另一台计算机上并在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 回复  |  直到 15 年前
        1
  •  2
  •   David Glass    15 年前

    你可以试着调查 TCPView (它也显示UDP)以查看生产服务器上是否显示任何内容。退房 Troubleshooting Windows Firewall settings “,虽然这是针对XP的,我怀疑您的生产服务器是XP,但它可能还是有帮助的。请参阅netstat示例。