Asp.net mvc 4 将多部分表单数据从windows phone发送到web api

Asp.net mvc 4 将多部分表单数据从windows phone发送到web api,asp.net-mvc-4,asp.net-web-api,http-post,windows-phone-8.1,http-put,Asp.net Mvc 4,Asp.net Web Api,Http Post,Windows Phone 8.1,Http Put,您好,我想使用HttpClient将一些数据(包含字符串、int和流)从WindowsPhone8.1发送(post/put)到WebAPI。最好的方法是什么 public async void Put(string uri) { var httpClient = new System.Net.Http.HttpClient(); MultipartFormDataContent content = new MultipartFormDataConte

您好,我想使用HttpClient将一些数据(包含字符串、int和流)从WindowsPhone8.1发送(post/put)到WebAPI。最好的方法是什么

 public async void Put(string uri)
    {
        var httpClient = new System.Net.Http.HttpClient();

        MultipartFormDataContent content = new MultipartFormDataContent();
        var stringContent = new StringContent("FirstName=MUH&LastName=Test", Encoding.UTF8, "multipart/form-data");
        var test = new StreamContent(new MemoryStream());
        content.Add(test);
        content.Add(stringContent);
        var message = await httpClient.PutAsync(url+"/UpdateTest", content);

        message.EnsureSuccessStatusCode();

        string content1 = await message.Content.ReadAsStringAsync();

    }
我的mvc应用程序中的api方法

 [AllowAnonymous]
    [Route("~/api/account/UpdateTest")]
    [HttpPut]
    public async Task<object> UpdateTest()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }
        try
        {
            var requestParts = await Request.Content.ReadAsMultipartAsync();
            foreach (var part in requestParts.Contents)
            {
                //part is always StreamContent
                var test = await part.ReadAsStreamAsync();
                var test1 = await part.ReadAsStringAsync();
            }
        }
        catch (Exception ex)
        { }
    }
[AllowAnonymous]
[路由(“~/api/account/UpdateTest”)]
[HttpPut]
公共异步任务UpdateTest()
{
如果(!Request.Content.IsMimeMultipartContent())
{
抛出新的HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
尝试
{
var requestParts=wait Request.Content.ReadAsMultipartAsync();
foreach(requestParts.Contents中的var部分)
{
//部分永远是内容
var test=wait part.ReadAsStreamAsync();
var test1=await part.ReadAsStringAsync();
}
}
捕获(例外情况除外)
{ }
}
在我的windows phone项目中,我通过了2个HttpContent,一个是StreamContent,另一个是StringContent。但在我的WebAPI put方法中,两者都是StreamContent,我不知道为什么

另一个问题是我必须解析StingContnet中的字符串键值。我的问题是,从windows phone 8.1到web api发送/接收多部分表单数据的最佳方式是什么

谢谢

以下是一个示例(根据您的场景相应地更改):



还要注意的是,您可以随意读取
StreamContent
。。在下面的示例中,我模拟了一个请求的主体流,并将其作为一个简单字符串读取,或者反序列化为Person类型的对象

StreamContent requestStream = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes("Hello World!")));
string data = await requestStream.ReadAsStringAsync();

//---------------------

StreamContent requestStream = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes("{ \"FirstName\" : \"Michael\" }")));
requestStream.Headers.ContentType = new MediaTypeHeaderValue("application/json");
Person person = await requestStream.ReadAsAsync<Person>();
StreamContent requestStream=newstreamcontent(newmemorystream(Encoding.UTF8.GetBytes(“helloworld!”));
字符串数据=wait requestStream.ReadAsStringAsync();
//---------------------
StreamContent requestStream=newstreamcontent(newmemoryStream(Encoding.UTF8.GetBytes(“{\“FirstName\”:\“Michael\”)));
requestStream.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/json”);
Person=等待requestStream.ReadAsAsync();

我使用基于本文代码的自定义媒体类型格式化程序


与MultipartFormDataStreamProvider相比的一个优点是,我不需要指定文件夹来保存文件数据,因此我可以检查内存中的内容。不过,您可能不希望对大型文件执行此操作。如果您想查看代码,也有很多github回购协议。此外,我还为文件和表单数据获取强类型对象

谢谢@Kiran Challa我对HttpClient web api非常熟悉调用您的示例解释我缺少的内容。@KiranChalla方法
public async Task Post()
的用途是什么??
public async Task Post()
{
    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.BadRequest);
    }

    MultipartFormDataStreamProvider prov = await Request.Content.ReadAsMultipartAsync<MultipartFormDataStreamProvider>(new MultipartFormDataStreamProvider(@"C:\uploadedfiles"));

    // example of how you can read the form data
    string firstName = prov.FormData["FirstName"];

    // Get list of all files that have been uploaded and stored in the above provided root folder 
    Collection<MultipartFileData> files = prov.FileData;
}
POST http://localhost:9095/api/values HTTP/1.1
Content-Type: multipart/form-data; boundary="7560a854-a71a-4e55-9571-5c2de520f45f"
Host: kirandesktop:9095
Content-Length: 474
Expect: 100-continue
Connection: Keep-Alive

--7560a854-a71a-4e55-9571-5c2de520f45f
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=FirstName

Michael
--7560a854-a71a-4e55-9571-5c2de520f45f
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=LastName

Jordan
--7560a854-a71a-4e55-9571-5c2de520f45f
Content-Disposition: form-data; name=Data; filename=File1.txt; filename*=utf-8''File1.txt

This is from a file
--7560a854-a71a-4e55-9571-5c2de520f45f--
StreamContent requestStream = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes("Hello World!")));
string data = await requestStream.ReadAsStringAsync();

//---------------------

StreamContent requestStream = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes("{ \"FirstName\" : \"Michael\" }")));
requestStream.Headers.ContentType = new MediaTypeHeaderValue("application/json");
Person person = await requestStream.ReadAsAsync<Person>();