/** * This method will be called when a client/browser makes a request. We will pass on * required information to the hosting API from this method */ private void ContextReceivedCallback(IAsyncResult asyncResult) { //Check if listener is listening other wise return if (!m_HttpListener.IsListening) { return; } //Get the context HttpListenerContext listenerContext = m_HttpListener.EndGetContext(asyncResult); //Lets get the Listener listening for the next request m_HttpListener.BeginGetContext(new AsyncCallback(ContextReceivedCallback), null); //If No AspNetEngine was configured, just respond with 404 if (m_AspNetEngine == null) { listenerContext.Response.StatusCode = 404; listenerContext.Response.Close(); return; } //Retrieve the URL requested String pageRequested = listenerContext.Request.Url.LocalPath; //Remove the "/alias" from the begining page request as we just need to //pass the file and the query out to the Application Host pageRequested = AspxVirtualRoot.RemoveAliasFromRequest(pageRequested, m_AspNetEngine.VirtualAlias); //Prepare the DataHolder object that will be passed on for processing AspxRequestInfo dataHolder = AspxNetEngine.PrepareAspxRequestInfoObject(listenerContext);; //Look for Client Certificate if it has any if (listenerContext.Request.IsSecureConnection) { dataHolder.m_ClientCertificate = listenerContext.Request.GetClientCertificate(); Console.WriteLine("Client certificate received."); } try { //Pass the request to the Hosted application m_AspNetEngine.ExecutingAppDomain.ProcessRequest(pageRequested, listenerContext.Request.Url.Query.Replace("?", ""), dataHolder); } catch (AspxException aspxException) { //Error occured.Log it and move on Console.WriteLine(aspxException); } Console.WriteLine(listenerContext.Request.Url.LocalPath + "... " + listenerContext.Response.StatusCode + " " + listenerContext.Response.StatusDescription); //Finally close the response or else the client will time out listenerContext.Response.Close(); }
/** * Called to configure a Physical directory as a Virtual alias. * To configure a directory as a AspxApplication, the exe for this project ASPXhostCS.exe * and ASPXHostCS.exe.config (if present) should be present in the bin directory under * the physical directory being configured. The reason being, that the call to API * ApplicationHost.CreateApplicationhost creates a new app domain and will instantiate * a class specified in the typeof variable. Putting it in the bin directory enables * the hosting api to load the class. */ internal AspxNetEngine(String virtualAlias, String physicalDir) { m_VirtualAlias = virtualAlias; m_PhysicalDirectory = physicalDir; Console.WriteLine("Creating a new AspxEngine."); //m_ExecutingEngine will be the actual object that the hosting API created for //us and so to execute a page in the Application we will call this object to //process requests m_ExecutingAppDomain = (AspxNetEngine)ApplicationHost.CreateApplicationHost(typeof(AspxNetEngine), m_VirtualAlias, m_PhysicalDirectory); Console.WriteLine("New AspxEngine created for alias " + m_VirtualAlias); }
/** * Take in a virtual alias and a physical directory to be configured */ public void Configure(String virtualAlias, String physicalDirectory) { m_AspNetEngine = new AspxNetEngine(virtualAlias, physicalDirectory); }