从 c# 表单应用程序发布到 api 时,我无法将数据发送到日期时间

Posted

技术标签:

【中文标题】从 c# 表单应用程序发布到 api 时,我无法将数据发送到日期时间【英文标题】:I cannot send data to datetime when posting to api from c# form application 【发布时间】:2021-07-10 05:36:14 【问题描述】:

我使用 c# 表单应用程序发布到 api。我需要发送的数据是日期时间。我正在编写下面的代码,但无法发送日期时间。

 private void button1_Click(object sender, EventArgs e)

   DateTime datetimeValues = DateTime.Now;

   var values = new Values()
   
      name = "example_name",
      datetime = datetimeValues
   
   
   HttpClient client = new HttpClient();
   client.BaseAddress = new Uri("http://localhost:20295/");
   HttpResponseMessage response = client.PostAsJsonAsync("api/test", values).Result;

当我编写此代码时,发送其他数据没有任何问题,但日期时间发送为空。可能是什么问题?

api/test 发布请求;

 public string Post(Data data)
    
        try
        
            DataTable dt = new DataTable();
            string query = @"insert into Table 
                            (name, addedDate)
                            values(
                            '"+data.name+"', '"+data.addedDate+"')";
            using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["App"].ConnectionString))
            using (var cmd = new SqlCommand(query, con))
            using (var da = new SqlDataAdapter(cmd))
            
                cmd.CommandType = CommandType.Text;
                da.Fill(dt);
            

            return "Successful";
        
        catch (Exception ex)
        
            return "Error!" + ex.Message;
        
    

【问题讨论】:

请附上api/test上处理POST请求的代码。没有这些信息将很难为您提供帮助 我添加了 api / test post request @AndreiKhotko 你的代码中有很多小问题。您能否也添加Data 类的定义,并在我写您问题的答案时告诉您使用什么数据库? 我使用的是 ms sql server。数据类中有我要发送的数据。我发送这些数据没有问题。但是当我想通过 winform 发送日期时间时,它将它添加为空。 @AndreiKhotko 如果可能的话,我建议使用相同类型的客户端和服务器端(或使两者都遵循相同的界面)以避免此类问题 【参考方案1】:

当我写这段代码时,发送其他数据没有任何问题,但是 datetime 发送为 null

那是因为您在服务器上的 Data 类具有名为 DateTime addedDate 的属性,而客户端发送带有字段 DateTime datetime 的合同 Values。服务器接受名称为addedDateDateTime 字段。

所以你有几个选择来修复它:

将客户端上的属性从 Values.datetime 重命名为 Values.addedDate 将服务器上的属性从 Data.addedDate 重命名为 Data.datetime 取决于所使用的 JSON 序列化库 服务器,使用 JSON PropertyName 属性。例如,对于 库 JSON.NET (Newton JSON) 它将是 [JsonProperty("name")]。 请参阅此处的文档 (link)

附:与主要问题无关的建议:不要像您那样直接在查询字符串中将参数的值添加到 SQL 查询中。这是数据库安全性的一个巨大漏洞。这是众所周知的问题,称为SQL-Injection technique。为避免它使用command.Parameters.Add() 方法。在你的情况下,它会是这样的:

DataTable dt = new DataTable();
string query = "insert into Table (name, addedDate) values(@name, addedDate)";
using(var con = new SqlConnection(ConfigurationManager.ConnectionStrings["App"].ConnectionString))
using(var cmd = new SqlCommand(query, con))
using(var da = new SqlDataAdapter(cmd))

    cmd.CommandType = CommandType.Text;
    cmd.Parameters.Add("@name", SqlDbType.VarChar);
    cmd.Parameters["@name"].Value = data.name;

    cmd.Parameters.Add("@addedDate", SqlDbType.DateTime2);
    cmd.Parameters["@addedDate"].Value = data.addedDate;
    da.Fill(dt);

【讨论】:

在您为解决方案编写之后,我再次查看了我的代码并意识到我遗漏了一个小细节。我也会考虑你的建议。问题解决了。谢谢! 您可以在一行中添加参数和值,例如:cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = data.name;。这是通常的形式。【参考方案2】:

尝试在 api/test 上将日期时间作为字符串发送,并在后端使用 DateTime.TryParse(); 将日期转换为 DateTime 格式的日期

【讨论】:

以上是关于从 c# 表单应用程序发布到 api 时,我无法将数据发送到日期时间的主要内容,如果未能解决你的问题,请参考以下文章

将表单从客户端发布到 AWS API 网关功能时如何修复 CORS 错误?

如何从表单将 2GB+ 的大文件上传到 .NET Core API 控制器?

如何使用 Xamarin 表单和 C# 将 Html 数据从网站保存到文本文件

计划启动 C# 应用程序无法为登录用户显示表单

如何将 MJPEG 流保存到磁盘(C# .NET)?

从 C# 上的函数处理程序访问表单控件