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

时间:2009-12-14 23:07:11

标签: c# .net iis asp.net-2.0 udpclient

我在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 个答案:

答案 0 :(得分:2)

您可以尝试使用TCPView(它也显示UDP)进行调查,以查看生产服务器上是否显示任何内容。看看“Troubleshooting Windows Firewall settings”,虽然这是针对XP而我怀疑你的生产服务器是XP,但无论如何它可能会有所帮助。请参阅netstat示例。

相关问题