У меня есть следующий прослушиватель 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
}
}
Теперь я очень отчаялся. Пожалуйста помоги. (