簡體   English   中英

ASP.NET UDP套接字代碼在開發中工作,但在IIS上不生產

[英]ASP.NET UDP socket code works in development, but not in production on IIS

我在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

  }
}

我現在變得非常絕望。 請幫忙。 :(

您可以嘗試使用TCPView進行調查(它也顯示UDP)以查看生產服務器上是否顯示任何內容。 查看“ Windows防火牆設置疑難解答 ”,雖然這是針對XP而我懷疑您的生產服務器是XP,但無論如何它可能會有所幫助。 請參閱netstat示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM