The HTTP request and how it relates to System.Net.HttpListener
This is part 2 of the sequel to "How to build a web based user interaction layer in C#". In this post, I will discuss how we can examine HTTP requests received from clients.
In part 1, we learn how we can get an instance of the System.Net.HttpListenerContext
class whenever a client sends a HTTP request.
Continuing the sequel
The HTTP request received from the client will be represented as an instance of the System.Net.HttpListenerRequest
class and is available via the Request
property of the System.Net.HttpListenerContext
instance.
HttpListenerRequest clientRequest = context.Request;
From the HttpListenerRequest
instance, your C# program can examine the HTTP request received from the client.
The Url requested by the client
Uri requestUrl = clientRequest.Url;
The Url
property contains an instance of the System.Uri class that represents the HTTP resource requested by the client. With the Uri
instance, we can know which resource that a client wants to interact with, via the Uri.AbsolutePath
property.
string requestAbsolutePath = clientRequest.Uri.AbsolutePath;
The AbsolutePath property will contain the part of the url that is after the hostname and/or port and the first ? that denotes the first query string variable. For example,
/GetPersonName will be returned for
http://localhost:12345/GetPersonName?id=1
and
/GetPersonName&id=1 will be returned for
http://localhost:12345/GetPersonName&id=1.
If the second case occurs, your C# program can consider the case as a 404 immediately.
Query strings
Although we can get the query string via the Url
property of our HttpListenerRequest
instance, the QueryString
property of the HttpListenerRequest
instance provides better programmatic access to the query string values submitted by the client. The QueryString
property is an instance of the System.Collections.Specialized.NameValueCollection
class.
NameValueCollection queryStringCollection = clientRequest.QueryString; // Get the value of the variable named as "id" // id will be null when client does not send // any query string variable named as "id" string id = queryStringCollection["id"];
The HTTP method
string requestHttpMethod = clientRequest.HttpMethod;
With this information, your C# program can decide how to process input information from the client. For instance, if the client had indicated a HTTP Get, your C# program can take it that if there are any input from the client, it will be supplied as query strings. The System.Net.WebRequestMethods.Http
class supplies the possible values that may be contained in the HttpMethod
property of the HttpListenerRequest
instance.
The content type
The content type denotes the type of content that is contained in the HTTP request.
string requestContentType = clientRequest.ContentType;
This value is used in conjunction with the HTTP method.
For HTTP Get, the browser typically don't fill up the content type field.
For HTTP post, two possible values are:
- application/x-www-form-urlencoded
- multipart/form-data; boundary=----SomeRandomText
Example for client sending a HTTP Post request with content type application/x-www-form-urlencoded.
The HTTP request body
The HTTP request body is most probably filled up by the client for a HTTP post. To read the HTTP request body in your C# program, you can use the InputStream
property of the HttpListenerRequest
instance.
Stream requestBodyStream = clientRequest.InputStream;
Next in the line
This concludes part 2 of "How to build a web based user interaction layer in C#".
In part 3, I will discuss the HTTP response and how it relates to System.Net.HttpListener
.
Related posts
To digress, the following is a list of posts that relates to sending HTTP requests to web servers. Feel free to look through them as well. 🙂 For the adventurous, you can probably use the methods discussed in these post
- Downloading a file via HTTP post and HTTP get in C#
- Sending a file and some form data via HTTP post in C#
- Uploading large HTTP multipart request with
System.Net.HttpWebRequest
in C# - Handling web server communication feedback with
System.Net.WebException
in C#
Further reading elsewhere
What I have mentioned in this post is probably enough for your C# program to process HTTP requests received from clients in most situations. If your program needs to get more information from HTTP requests received from clients, check out the MSDN reference for the System.Net.HttpListenerRequest
class.