【问题标题】:Sending Multipart form data from windows phone to web api将多部分表单数据从 windows phone 发送到 web api
【发布时间】:2014-07-22 23:53:59
【问题描述】:

您好,我想使用 HttpClient 将一些数据(包含字符串、int 和 Stream)从 windows phone 8.1 发送(发布/放置)到 web api。最好的方法是什么。

 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)
        { }
    }

在我的 windows phone 项目中,我通过了 2 个 HttpContent,一个是 StreamContent,另一个是 StringContent。但在我的 web api put 方法中,两者都是 StreamContent 我不知道为什么。

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

谢谢

【问题讨论】:

    标签: asp.net-mvc-4 asp.net-web-api http-post windows-phone-8.1 http-put


    【解决方案1】:

    以下是一个示例(根据您的情况进行相应更改):

    HttpClient client = new HttpClient();
    client.BaseAddress = new Uri(baseAddress);
    
    HttpRequestMessage request = new HttpRequestMessage();
    
    MultipartFormDataContent mfdc = new MultipartFormDataContent();
    mfdc.Add(new StringContent("Michael"), name: "FirstName");
    mfdc.Add(new StringContent("Jordan"), name: "LastName");
    mfdc.Add(new StreamContent(content: new MemoryStream(Encoding.UTF8.GetBytes("This is from a file"))), 
            name: "Data", 
            fileName: "File1.txt");
    
    HttpResponseMessage response = await client.PostAsync(baseAddress + "/api/values", mfdc);
    

    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;
    }
    

    Fiddler 工具中的请求如下所示:

    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...在以下示例中,我模拟请求的主体流并将其作为简单字符串读取或反序列化为 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>();
    

    【讨论】:

    • 谢谢@Kiran Challa 我是 HttpClient web api 的新手,调用你的示例解释我缺少的内容。
    • @KiranChalla 方法public async Task Post()的目的是什么??
    【解决方案2】:

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

    ASP.NET WebApi: MultipartDataMediaFormatter

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

    【讨论】:

      猜你喜欢
      • 2017-09-06
      • 2013-03-22
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 2021-05-02
      相关资源
      最近更新 更多