如何通过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
相关产品推荐
相关产品推荐

