使用multipart / form-data上传 - 无法检索自托管服务中的文件

时间:2014-01-13 12:20:39

标签: c# web-services http servicestack

我正在使用ServiceStack网络服务来处理图片上传。

通过IISAppHostBase中托管此服务时,一切正常。

现在我已经切换到使用AppHostHttpListenerBase在控制台应用中运行的自托管服务,突然间我再也无法访问上传的数据了。

我使用以下属性来访问该文件:

var uploadedFiles = base.Request.Files;

自托管时,此IHttpFile数组为空。托管在ISS时,它包含上传内容。

客户端发送Content-Type multipart/form-data的请求,如下所示:

POST http://localhost:8081/upload/aaa HTTP/1.1
Accept: application/json
Content-Type: multipart/form-data; boundary="607a4dcf-585a-483b-b7dd-9f30d902e4a8"
Host: localhost:8081
Content-Length: 69553

--607a4dcf-585a-483b-b7dd-9f30d902e4a8
Content-Type: application/octet-stream
Content-Disposition: form-data; name=file; filename=file; filename*=utf-8''file

**** IMAGE DATA ****
--607a4dcf-585a-483b-b7dd-9f30d902e4a8--

我正在使用NuGet的ServiceStack 4.0.5版。主机项目运行的是.NET 4.5。

这是不是应该在自托管时工作,还是我必须配置一些东西才能使它工作?

1 个答案:

答案 0 :(得分:2)

我已经测试过在新的v4项目中使用ServiceStack上传文件。

Program.cs的

using System;
using ServiceStack;

namespace Testv4
{
    class MainClass
    {
        public static void Main()
        {
            var appHost = new AppHost(500);
            appHost.Init();
            appHost.Start("http://*:8082/");
            Console.ReadKey();
        }
    }

    public class TestApp
    {
        [Route("/upload", "POST")]
        public class UploadFileRequest {}

        public class TestController : Service
        {
            public void Any(UploadFileRequest request)
            {
                Console.WriteLine(Request.Files.Length);
            }
        }
    }

    public class AppHost : AppHostHttpListenerPoolBase
    {
        public AppHost(int poolSize) : base("Test Service", poolSize, typeof(TestApp).Assembly)
        {
        }

        public override void Configure(Funq.Container container)
        {
        }
    }
}

的index.html

<!doctype html>
<html>
    <head>
        <title>Test</title>
    </head>
    <body>
    <form action="/upload" method="POST" enctype="multipart/form-data">
        <h1>Upload File</h1>
        <input type="file" name="File1" />
        <input type="submit" value="Upload" />
    </form>
    </body>
</html>

HttpListener要求在文件名

周围引用Content-Disposition标题
  

content-disposition:form-data; NAME = “文件1”;文件名= “somefile.jpg”