Nancy: 解析“multipart/form-data”请求

5
我有一个RestSharp客户端和Nancy自托管服务器。 我想要的是:
从客户端发送多部分表单数据,并轻松解析该数据 从服务器:以multipart/form-data形式从RestSharp客户端发送二进制文件和Json数据,并能够从Nancy服务器获取二进制文件和Json对象
在客户端使用Restsharp:[http://restsharp.org/],我尝试发送包含二进制文件和一些元数据的"multipart/form-data"请求,该元数据采用json格式。
var client = new RestClient();
...

IRestRequest restRequest = new RestRequest("AcmeUrl", Method.POST);

restRequest.AlwaysMultipartFormData = true;
restRequest.RequestFormat = DataFormat.Json;

// I just add File To Request
restRequest.AddFile("AudioData", File.ReadAllBytes("filePath"), "AudioData");

// Then Add Json Object
MyObject myObject = new MyObject();
myObject.Attribute ="SomeAttribute";
....

restRequest.AddBody(myObject);

client.Execute<MyResponse>(request);

我正在使用 Nancy [http://nancyfx.org/] 作为服务器,尝试获取文件和 JSON 对象的元数据。

// Try To Get File : It Works
var file = Request.Files.FirstOrDefault();


// Try To Get Sended Meta Data Object  : Not Works. 
// Can Not Get MyObject Data

MyObject myObject = this.Bind<MyObject>();
1个回答

3
对于多部分数据,Nancy的代码会更复杂一些。尝试这样做:
 Post["/"] = parameters =>
    {
        try
        {
            var contentTypeRegex = new Regex("^multipart/form-data;\\s*boundary=(.*)$", RegexOptions.IgnoreCase);
            System.IO.Stream bodyStream = null;

            if (contentTypeRegex.IsMatch(this.Request.Headers.ContentType))
            {
                var boundary = contentTypeRegex.Match(this.Request.Headers.ContentType).Groups[1].Value;
                var multipart = new HttpMultipart(this.Request.Body, boundary);
                bodyStream = multipart.GetBoundaries().First(b => b.ContentType.Equals("application/json")).Value;
            }
            else
            {
                // Regular model binding goes here.
                bodyStream = this.Request.Body;
            }

            var jsonBody = new System.IO.StreamReader(bodyStream).ReadToEnd();

            Console.WriteLine("Got request!");
            Console.WriteLine("Body: {0}", jsonBody);
            this.Request.Files.ToList().ForEach(f => Console.WriteLine("File: {0} {1}", f.Name, f.ContentType));

            return HttpStatusCode.OK;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error!!!!!! {0}", ex.Message);
            return HttpStatusCode.InternalServerError;
        }
    };

请查看以下内容:

http://www.applandeo.com/en/net-and-nancy-parsing-multipartform-data-requests/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接