要理解的主要内容是HttpListener是一个处理http请求的低级工具。 所有发布数据都在HttpListenerRequest.InputStream流中。 假设我们有一个这样的表格:
现在我们想查看post数据。 让我们实现一个方法来做到这一点:
public static string GetRequestPostData(HttpListenerRequest request) { if (!request.HasEntityBody) { return null; } using (System.IO.Stream body = request.InputStream) // here we have data { using (System.IO.StreamReader reader = new System.IO.StreamReader(body, request.ContentEncoding)) { return reader.ReadToEnd(); } } }
上传一些文件并查看结果:
Content-Disposition: form-data; name="somename"; filename="D:\Test.bmp" Content-Type: image/bmp ...here is the raw file data...
接下来假设我们有简单的表单而不上传文件:
我们来看看输出:
firstname=MyName&lastname=MyLastName
组合forms结果:
Content-Disposition: form-data; name="firstname" My Name Content-Disposition: form-data; name="somename"; filename="D:\test.xls" Content-Type: application/octet-stream ...raw file data...
正如您在简单表单中看到的那样,您可以将InputStream读取为字符串并解析post值。 如果有一个更复杂的forms – 你需要执行更复杂的解析,但它仍然可以完成。 希望这个例子可以节省您的时间。 注意,并非总是将所有流读取为字符串。
我找到了一些MonoTouch的Web服务器示例,但没有一个解析了POST请求中发送的数据。 我环顾网络,无法找到任何如何实现这一目标的例子。 所以现在我自己写了这篇文章,我决定分享自己的实现。 这不仅包括处理表单发布数据的代码,还包括注册请求处理程序等的代码。
以下是如何使用Web服务器的示例
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(); }
以下是请求处理程序的两个应用程序特定示例
class IndexActionHandler : DefaultActionHandler { public IndexActionHandler(HttpListenerRequest request) : base(request) { } public override ActionResult Execute() { var result = new HtmlResult(); result.AppendLine(""); result.AppendLine(""); result.AppendLine("Upload an image
"); result.AppendLine(""); result.AppendLine(""); result.AppendLine(""); 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(""); result.AppendLine(""); if (errorMessage == null) result.AppendLine("File uploaded successfully
"); else { result.AppendLine("Error
"); result.AppendLine("" + errorMessage + "
"); } result.AppendLine(""); result.AppendLine(""); 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); } } }
您可以在此处下载源代码https://sites.google.com/site/mrpmorris/EmbeddedWebServerMT.zip