gpt4 book ai didi

c# - ASP.NET UDP 套接字代码适用于开发,但不适用于 IIS 的生产

转载 作者:行者123 更新时间:2023-11-30 17:23:46 24 4
gpt4 key购买 nike

我有以下 UDP 广播监听器作为静态组件在 ASP.NET Web 应用程序的单独线程中运行。为什么我会这样做真的不重要,但部署时这不起作用的原因让我感到困惑。我确实有几个发送 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)以查看生产服务器上是否显示任何内容。查看“Troubleshooting Windows Firewall settings”,虽然这是针对 XP 的,我怀疑您的生产服务器是 XP,但无论如何它可能会有帮助。请参阅 netstat 示例。

关于c# - ASP.NET UDP 套接字代码适用于开发,但不适用于 IIS 的生产,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1904162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com