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

如何通过HTTP POST将DataSet传递给Web API(C#客户端场景)

如何通过HTTP POST将DataSet传递给Web API?

看你之前是直接传自定义的person对象,现在要传包含四列的DataSet对吧?其实DataSet是个带结构的复杂对象,直接传递需要先序列化,这里给你两种实用的实现方案,附带客户端和Web API的完整代码示例:

方案一:将DataSet序列化为JSON传递

这种方式比较通用,现在大部分API都用JSON格式,需要用到Newtonsoft.Json(也就是Json.NET)来序列化DataSet,先在客户端和Web API项目里安装这个NuGet包。

客户端代码(WinForms按钮点击事件)

private async void btnInsert_Click(object sender, EventArgs e)
{
    using (var client = new HttpClient())
    {
        try
        {
            // 把DataSet序列化为JSON字符串,处理循环引用问题
            string jsonDataSet = Newtonsoft.Json.JsonConvert.SerializeObject(rslt, 
                Newtonsoft.Json.Formatting.None,
                new Newtonsoft.Json.JsonSerializerSettings
                {
                    ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
                });

            // 包装成JSON格式的请求内容
            var content = new StringContent(jsonDataSet, System.Text.Encoding.UTF8, "application/json");

            // 异步调用Web API的POST接口,替换成你的实际API地址
            var response = await client.PostAsync("http://your-api-domain/api/data/insertdataset", content);

            if (response.IsSuccessStatusCode)
            {
                MessageBox.Show("DataSet提交成功!");
            }
            else
            {
                MessageBox.Show($"提交失败:{response.StatusCode}");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"出错了:{ex.Message}");
        }
    }
}

Web API 接收端代码

using Newtonsoft.Json;
using System.Data;
using System.Web.Http;

public class DataController : ApiController
{
    [HttpPost]
    [Route("api/data/insertdataset")]
    public IHttpActionResult InsertDataSet([FromBody] string jsonDataSet)
    {
        try
        {
            // 将JSON字符串反序列化为DataSet
            DataSet receivedDataSet = JsonConvert.DeserializeObject<DataSet>(jsonDataSet);

            // 遍历DataSet里的第一个DataTable(假设你的数据存在第一个表)
            foreach (DataRow row in receivedDataSet.Tables[0].Rows)
            {
                // 提取每列数据,替换成你的数据库插入逻辑
                int pid = Convert.ToInt32(row["pid"]);
                int proid = Convert.ToInt32(row["proid"]);
                string name = row["name"].ToString();
                string msg = row["msg"].ToString();

                // 示例:调用你的数据访问层方法
                // YourDbService.InsertRecord(pid, proid, name, msg);
            }

            return Ok("DataSet已成功存入数据库");
        }
        catch (Exception ex)
        {
            return BadRequest($"处理失败:{ex.Message}");
        }
    }
}

方案二:利用DataSet的XML序列化传递

DataSet本身对XML有原生支持,不需要额外的序列化库,适合对XML格式友好的场景。

客户端代码

private async void btnInsert_Click(object sender, EventArgs e)
{
    using (var client = new HttpClient())
    {
        try
        {
            // 将DataSet序列化为XML字符串
            string xmlDataSet;
            using (System.IO.StringWriter sw = new System.IO.StringWriter())
            {
                rslt.WriteXml(sw);
                xmlDataSet = sw.ToString();
            }

            var content = new StringContent(xmlDataSet, System.Text.Encoding.UTF8, "application/xml");

            var response = await client.PostAsync("http://your-api-domain/api/data/insertdatasetxml", content);

            if (response.IsSuccessStatusCode)
            {
                MessageBox.Show("DataSet提交成功!");
            }
            else
            {
                MessageBox.Show($"提交失败:{response.StatusCode}");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"出错了:{ex.Message}");
        }
    }
}

Web API 接收端代码

using System.Data;
using System.IO;
using System.Web.Http;

public class DataController : ApiController
{
    [HttpPost]
    [Route("api/data/insertdatasetxml")]
    public IHttpActionResult InsertDataSetXml([FromBody] string xmlDataSet)
    {
        try
        {
            DataSet receivedDataSet = new DataSet();
            using (StringReader sr = new StringReader(xmlDataSet))
            {
                receivedDataSet.ReadXml(sr);
            }

            // 同样的数据库插入逻辑
            foreach (DataRow row in receivedDataSet.Tables[0].Rows)
            {
                int pid = Convert.ToInt32(row["pid"]);
                int proid = Convert.ToInt32(row["proid"]);
                string name = row["name"].ToString();
                string msg = row["msg"].ToString();

                // YourDbService.InsertRecord(pid, proid, name, msg);
            }

            return Ok("DataSet已成功存入数据库");
        }
        catch (Exception ex)
        {
            return BadRequest($"处理失败:{ex.Message}");
        }
    }
}

几个重要的注意事项

  • 我把客户端代码改成了async/await异步方式,避免阻塞WinForms的UI线程,生产环境别用.Result同步等待,容易造成界面假死。
  • 确保Web API的路由配置正确,比如在WebApiConfig.cs里启用了属性路由或者默认路由。
  • 如果你的DataSet包含多个DataTable,记得在接收端指定正确的表名(比如receivedDataSet.Tables["YourTableName"]),而不是直接用索引[0]。
  • 数据类型转换的时候要注意空值情况,比如可以用row.IsNull("pid")来判断,避免抛出转换异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:55:11