I found some examples of web servers for MonoTouch, but none of them analyzed the data sent in the POST request. I looked through the network and could not find examples of how to achieve this. So, now that I wrote this myself, I decided to share my own implementation. This includes not only code for processing form data, but also for registering request handlers, etc.
Here is an example of how you will use the web server
public BookUploadViewController() : base("BookUploadViewController", null) { RequestHandler = new DefaultRequestHandler(); var defaultActionHandlerFactory = new DefaultActionHandlerFactory(); RegisterActionHandlers(defaultActionHandlerFactory); RequestHandler.AddActionHandlerFactory(defaultActionHandlerFactory); WebServer = new EmbeddedWebServer(RequestHandler); } void RegisterActionHandlers(DefaultActionHandlerFactory factory) { factory.RegisterHandler( request => request.RawUrl == "/", request => new IndexActionHandler(request) ); factory.RegisterHandler( request => string.Compare(request.RawUrl, "/Upload", true) == 0 && string.Compare(request.HttpMethod, "POST", true) == 0, request => new UploadActionHandler(request) ); } public override void ViewDidAppear(bool animated) { base.ViewDidAppear(animated); StatusLabel.Text = string.Format("Server listening on\r\nhttp://{0}:8080", GetIPAddress ()); WebServer.Start(8080); } public override void ViewDidDisappear (bool animated) { base.ViewDidDisappear(animated); WebServer.Stop(); }
And here are two examples of specific request handlers
class IndexActionHandler : DefaultActionHandler { public IndexActionHandler(HttpListenerRequest request) : base(request) { } public override ActionResult Execute() { var result = new HtmlResult(); result.AppendLine("<html>"); result.AppendLine("<body>"); result.AppendLine("<h1>Upload an image</h1>"); result.AppendLine("<form action='/Upload' enctype='multipart/form-data' method='post'>"); result.AppendLine ("<input name='Image' type='file'/><br/>"); result.AppendLine("<input name='Upload' type='submit' text='Upload'/>"); result.AppendLine("</form>"); result.AppendLine("</body>"); result.AppendLine("</html>"); return result; } } class UploadActionHandler : DefaultActionHandler { public UploadActionHandler(HttpListenerRequest request) : base(request) { } public override ActionResult Execute() { string errorMessage = null; var file = FormData.GetFile("Image"); if (file == null || file.FileData == null || file.FileData.Length == 0 || string.IsNullOrEmpty(file.FileName)) errorMessage = "No image uploaded"; if (errorMessage == null) ProcessFile(file); var result = new HtmlResult(); result.AppendLine("<html>"); result.AppendLine("<body>"); if (errorMessage == null) result.AppendLine("<h1>File uploaded successfully</h1>"); else { result.AppendLine("<h1>Error</h1>"); result.AppendLine("<h2>" + errorMessage + "</h2>"); } result.AppendLine("</body>"); result.AppendLine("</html>"); return result; } void ProcessFile(MultiPartStreamFileValue postedFile) { string fileName = "Where to save the file"; using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)) { fileStream.Write(postedFile.FileData, 0, postedFile.FileData.Length); } } }
You can download the source code here https://sites.google.com/site/mrpmorris/EmbeddedWebServerMT.zip
Peter Morris
source share