Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpClient将MultipartFormData上载到play 2框架_C#_Windows Phone 8_Playframework 2.0_Http Post_Multipartform Data - Fatal编程技术网

C# HttpClient将MultipartFormData上载到play 2框架

C# HttpClient将MultipartFormData上载到play 2框架,c#,windows-phone-8,playframework-2.0,http-post,multipartform-data,C#,Windows Phone 8,Playframework 2.0,Http Post,Multipartform Data,我在使用RestSharp客户端的Windows Phone 8项目中有以下代码: public async Task<string> DoMultiPartPostRequest(String ext, JSonWriter jsonObject, ObservableCollection<Attachment> attachments) { var client = new RestClient(DefaultUri); //

我在使用RestSharp客户端的Windows Phone 8项目中有以下代码:

public async Task<string> DoMultiPartPostRequest(String ext, JSonWriter jsonObject, ObservableCollection<Attachment> attachments)
    {
        var client = new RestClient(DefaultUri);
        // client.Authenticator = new HttpBasicAuthenticator(username, password);

        var request = new RestRequest(ext, Method.POST);

        request.RequestFormat = DataFormat.Json;
        request.AddParameter("json", jsonObject.ToString(), ParameterType.GetOrPost);

        // add files to upload
        foreach (var a in attachments)
            request.AddFile("attachment", a.FileBody, "attachment.file", a.ContType);

        var content = await client.GetResponseAsync(request);

        if (content.StatusCode != HttpStatusCode.OK)
            return "error";

        return content.Content;
    }
上面的代码在Play2API上运行良好。然而,由于RestSharp似乎不稳定,我决定使用微软提供的原生HttpClient

因此,我编写了另一个函数,它使用HttpClient执行相同的任务:

public async Task<string> DoMultiPartPostRequest2(String ext, JSonWriter jsonObject,
                                                                 ObservableCollection<Attachment> attachments)
    {
        var client = new HttpClient();

        var content = new MultipartFormDataContent();

        var json = new StringContent(jsonObject.ToString());
        content.Add(json, "json");

        foreach (var a in attachments)
        {
            var fileContent = new StreamContent(new MemoryStream(a.FileBody));
            fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
            {
                Name = "attachment",
                FileName = "attachment.file"
            };
            fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(a.ContType);
            content.Add(fileContent);
        }

        var resp = await client.PostAsync(DefaultUri + ext, content);

        if (resp.StatusCode != HttpStatusCode.OK)
            return "error";

        var reponse = await resp.Content.ReadAsStringAsync();

        return reponse;
    }
到目前为止还不错。在我看来,这两个标题似乎是相同的

但是,当我在执行
Http.MultipartFormData body=request().body().asMultipartFormData()之后调试Play2API时我注意到多部分数据没有被正确解析

更具体地说,body变量中的multipart字段如下所示:

MultipartFormData(Map(),List(),List(BadPart(Map(ntent-type -> text/plain; charset=utf-8, content-disposition -> form-data; name=json)), BadPart(Map()), BadPart(Map()), BadPart(Map()), BadPart(Map())),List())
正如您所注意到的,它有几个(在本例中实际上是5个)坏部件。 示例:
BadPart(映射(内容类型->文本/普通;字符集=utf-8,内容配置->表单数据;名称=json))

有人能看到这里出了什么问题吗?HttpClient生成的头是否错误?

以下是解决方案。。(黑客)

当边界中有引号时,Play框架似乎有问题

因此,我在创建multipart后添加了以下代码以删除它们:

var content = new MultipartFormDataContent();

foreach (var param in content.Headers.ContentType.Parameters.Where(param => param.Name.Equals("boundary")))
     param.Value = param.Value.Replace("\"", String.Empty);
最后,我必须手动将引号“\”添加到标题上的特定值,如下所示:

POST http://192.168.1.101:9000/rayz/create HTTP/1.1
Accept: */*
Content-Length: 6633
Accept-Encoding: identity
Content-Type: multipart/form-data; boundary="e01b2196-d24a-47a2-a99b-e82cc4a2f92e"
User-Agent: NativeHost
Host: 192.168.1.101:9000
Connection: Keep-Alive
Pragma: no-cache

--e01b2196-d24a-47a2-a99b-e82cc4a2f92e
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=json

{
    "userId": "2D73B43390041E868694A85A65E47A09D50F019C180E93BAACC454488F67A411",
    "latitude": "35.09",
    "longitude": "33.30",
    "accuracy": "99",
    "maxDistance": "dist",
    "Message": "test"
}
--e01b2196-d24a-47a2-a99b-e82cc4a2f92e
Content-Disposition: form-data; name=attachment; filename=attachment.file
Content-Type: image/jpeg

?????JFIF??`?`?????C?  $" &0P40,,0bFJ:Ptfzxrfpn????????np????????|????????????C"$$0*0^44^?p????????????????????????????????????????????????????????"??????????????
--e01b2196-d24a-47a2-a99b-e82cc4a2f92e--
原始:
内容处置:表单数据;名称=附件;文件名=附件.file
更改为:
Content-Disposition:form-data;name=“attachment”;filename=“attachment.file”

原始:
Content-Disposition:form-data;name=json
更改为:
Content-Disposition:form-data;name=“json”

我不认为在标题中有引号或没有引号是错误的,也许应该相应地修复play框架上的解析

var content = new MultipartFormDataContent();

foreach (var param in content.Headers.ContentType.Parameters.Where(param => param.Name.Equals("boundary")))
     param.Value = param.Value.Replace("\"", String.Empty);