You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms应用发送multipart form-data POST请求数据未提交问题

问题分析与解决方案

你这是踩了个典型的误区:虽然把StringContent的媒体类型标成了multipart/form-data,但这根本不是构造multipart请求的正确姿势。StringContent只是把JSON字符串原封不动打包,服务端没法按照multipart的规则解析到你的数据,自然就出现“返回成功但没收到内容”的情况了。

修正方案

要正确发送multipart/form-data格式的请求,得用MultipartFormDataContent类来构建请求体,而不是硬套StringContent。下面是调整后的完整代码:

public class Post { 
    public string ConnectionId { get; set; } 
    public string HolderFirstName { get; set; } 
}

// 建议把HttpClient作为类成员复用,避免每次请求都创建新实例浪费资源
private readonly HttpClient _client = new HttpClient();

public async void SendProof(object sender, EventArgs e) {
    try {
        Uri URL = new Uri("http://11.222.333.44:4000/api/v1/Proof/SendProofNameRequest");
        
        var post = new Post {
            ConnectionId = "9c12dba2-6cb9-4382-8c96-f1708a7e8816", 
            HolderFirstName = "Carl Dreyer"
        };

        // 构建标准的multipart/form-data请求内容
        var multipartContent = new MultipartFormDataContent();
        // 逐个添加表单字段,第二个参数要和服务端API要求的字段名完全匹配
        multipartContent.Add(new StringContent(post.ConnectionId), "ConnectionId");
        multipartContent.Add(new StringContent(post.HolderFirstName), "HolderFirstName");

        var response = await _client.PostAsync(URL, multipartContent);
        
        if (response.IsSuccessStatusCode) {
            await DialogService.AlertAsync("Credential Proof Sent Successfully!");
        } else {
            // 新增非成功状态码的处理,方便排查问题
            var errorDetail = await response.Content.ReadAsStringAsync();
            await DialogService.AlertAsync($"Request failed: {response.StatusCode} - {errorDetail}");
        }
    } catch(Exception error) {
        await DialogService.AlertAsync(error.Message);
    }
}

public ICommand SendProofCommand => new Command(() => SendProof(default, default));

关键点说明

  • MultipartFormDataContent会自动生成符合规范的边界分隔符,服务端能通过这个边界区分不同的表单字段,这是StringContent做不到的。
  • 添加字段时,第二个参数的字段名必须和服务端API接收的参数名完全一致,不然服务端找不到对应的数据。
  • 把HttpClient作为类成员复用是.NET的最佳实践,频繁创建实例会导致不必要的资源消耗。

这样修改后,服务端应该就能正确接收到你的表单数据了。

内容的提问来源于stack exchange,提问作者user14139029

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:12:38