I know of a few good ways to build web clients in PowerShell: the .NET classes System.Net.WebClient and System.Net.HttpWebRequest, or the COM object Msxml2.XMLHTTP. From what I can tell, the only one which gives you access to the numeric status code (e.g. 200, 404), is the last, the COM object. The problem I have is that I don't like the way it works and I don't like relying on the COM object being there. I also know that from time to time Microsoft will decide to kill COM objects (ActiveX kill bits) due to security vulnerabilities and so on.
Is there another .NET method I'm missing? Is the status code in one of these other two objects and I just don't know how to get at it?
I realize the question's title is about powershell, but not really what the question is asking? Either way...
The WebClient is a very dumbed down wrapper for HttpWebRequest. WebClient is great if you just doing very simple consumption of services or posting a bit of Xml, but the tradeoff is that it's not as flexible as you might want it to be. You won't be able to get the information you are looking for from WebClient.
If you need the status code, get it from the HttpWebResponse. If you were doing something like this (just posting a string to a Url) w/ WebClient:
var bytes = System.Text.Encoding.ASCII.GetBytes("my xml"); var response = new WebClient().UploadData("http://webservice.com", "POST", bytes);
then you'd do this with HttpWebRequest to get status code. Same idea, just more options (and therefore more code).
//create a stream from whatever you want to post here var bytes = System.Text.Encoding.ASCII.GetBytes("my xml"); var request = (HttpWebRequest)WebRequest.Create("http://webservice.com"); //set up your request options here (method, mime-type, length) //write something to the request stream var requestStream = request.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); var response = (HttpWebResponse)request.GetResponse(); //returns back the HttpStatusCode enumeration var httpStatusCode = response.StatusCode;