Esempio n. 1
0
        private void ProcessRequestWorker(object parm)
        {
            SocketWrapperBase sock = (SocketWrapperBase)parm;
            var et = Environment.TickCount;

            try
            {
                var client = (sock.RemoteEndPoint as IPEndPoint).Address;

                lock (m_clients)
                {
                    if (!m_clients.Contains(client))
                    {
                        if (m_clients.Count >= m_maxConnections)
                        {
                            var errorHandler = new DefaultWorkerRequest(sock, m_logProvider);
                            HttpRuntime.ProcessError(errorHandler, HttpErrorCode.Forbidden, "Maximum Connections Exceeded");
                            return;
                        }
                        else
                        {
                            m_clients.Add(client);
                        }
                    }
                }

                ThreadPool.QueueUserWorkItem(delegate
                {
                    try
                    {
                        HttpWorkerRequest wr = new AsyncWorkerRequest(sock, m_logProvider);
                        HttpRuntime.ProcessRequest(wr, m_logProvider);
                    }
                    catch (Exception ex)
                    {
                        string text = string.Format("HttpRuntime.ProcessRequest thread threw {0}: {1}", ex.GetType().Name, ex.Message);
                        m_logProvider.LogPadarnError(text, null);
                    }
                    finally
                    {
                        lock (m_clients)
                        {
                            m_clients.Remove(client);
                        }
                    }
                });
            }
            catch (Exception ex)
            {
                string text = string.Format("HttpRequestListener.ProcessRequest threw {0}: {1}", ex.GetType().Name, ex.Message);
                m_logProvider.LogPadarnError(text, null);
            }
            finally
            {
                et = Environment.TickCount - et;
            }
        }