Identifying memory leaks can be pretty tricky in the .Net Framework.
Memory is only released from time to time by the garbage collector.
Previously because of a bug, disposed objects were not really disposed because of an internal reference. This bug was fixed.
I ran your program for several minutes and the memory stopped increasing after a while (the program continued to run properly).
I added the following lines to be sure that the request and response objects are disposed: (line 79)
Response.Close
Request.Dispose
AddObject("Request", "WebRequest")
Response.Dispose
AddObject("Response", "WebResponse")