// Library1.fs content
namespace FSharpHttpAsyncHandler.Lib

open System
open System.Web
open System.Threading

type AsynchOperation (callback:AsyncCallback, context:HttpContext,  state:Object) as this =
    let _callback:AsyncCallback = callback
    let _context:HttpContext = context
    let _state:Object = state
    let mutable _completed:bool = false

    interface IAsyncResult with

        member x.IsCompleted
            with get() =
                _completed

        member x.AsyncWaitHandle
            with get() =
                null

        member x.AsyncState
            with get() =
                _state

        member x.CompletedSynchronously
            with get() =
                false

    member x.StartAsyncTask(workItemState:Object) :unit =
        _context.Response.Write("<p>Completion IsThreadPoolThread is " + (Thread.CurrentThread.IsThreadPoolThread).ToString() + "</p>\r\n")
        _context.Response.Write("Hello World from Async Handler!")
        _completed <- true
        _callback.Invoke(this:>IAsyncResult)

    member x.StartAsyncWork() =
        ThreadPool.QueueUserWorkItem(new WaitCallback(x.StartAsyncTask), null)

type HTTPAsyncHandler () =
    interface IHttpAsyncHandler with

        member x.IsReusable
            with get() = 
                false

        member x.BeginProcessRequest(context:HttpContext, cb:AsyncCallback, extraData:Object):IAsyncResult =
            context.Response.Write("<p>Begin IsThreadPoolThread is " + (Thread.CurrentThread.IsThreadPoolThread).ToString() + "</p>\r\n")
            let asynch:AsynchOperation = new AsynchOperation(cb, context, extraData)
            asynch.StartAsyncWork()|> ignore
            asynch:>IAsyncResult

        member x.ProcessRequest(context:HttpContext):unit =
            raise (new System.InvalidOperationException())

        member x.EndProcessRequest((result:IAsyncResult)):unit =
            ()
(* Web.config
<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true"/>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
    <handlers>
      <add name="FunctionalHandler" preCondition="integratedMode" verb="*" path="*" type="FSharpHttpAsyncHandler.Lib.HTTPAsyncHandler, FSharpHttpAsyncHandler.Lib"/>
    </handlers>
  </system.webServer>
</configuration>     
*)