I would use a httpwebrequest object.
depending on the size pdfs, and response time of servers you could do this asynchronously or synchronously. This is the synchronous flavor using the GetResponse()
method.
void DoPDFDownload(string strMyUrl, string strPostData, string saveLocation)
{
//create the request
var wr = (HttpWebRequest)WebRequest.Create(myURL);
wr.Method = "POST";
wr.ContentLength = strPostData.Length;
//Identify content type... strPostData should be url encoded per this next
//declaration
wr.ContentType = "application/x-www-form-urlencoded";
//just for good measure, set cookies if necessary for session management, etc.
wr.CookieContainer = new CookieContainer();
using(var sw = new StreamWriter(wr.GetRequestStream()))
{
sw.Write(strPostData);
}
var resp = wr.GetResponse();
//feeling rather lazy at this point, but if you need further code for writing
//response stream to a file stream, I can provide.
//...
}
The following is a little method you could copy/paste into LINQPad to get an idea of how these classes work.
void DoSpeedTestDownloadFromFCC()
{
string strMyUrl = "http://data.fcc.gov/api/speedtest/find?latitude=38.0&longitude=-77.5&format=json";
//create the request
var wr = (HttpWebRequest)WebRequest.Create(strMyUrl);
wr.ContentLength = strPostData.Length;
//Note that I changed the method for the webservice's standard.
//No Content type on GET requests.
wr.Method = "GET";
//just for good measure, set cookies if necessary for session management, etc.
wr.CookieContainer = new CookieContainer();
var resp = wr.GetResponse();
//...
using(StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
//here you would write the file to disk using your preferred method
//in linq pad, this just outputs the text to the console.
sr.ReadToEnd().Dump();
}
}