从HttpListenerRequest获取表单数据

我有一个HttpListenerRequest,它是从发布的html

启动的。 我需要知道如何获取发布的表单值+上传的文件。 有没有人知道一个例子来节省我为自己做的时间? 我有一个谷歌,但没有找到任何使用。

要理解的主要内容是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... 

接下来假设我们有简单的表单而不上传文件:

 
First name:
Last name:

我们来看看输出:

 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(""); 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