【问题标题】:XAML - PostAsync sending null data to databaseXAML - PostAsync 将空数据发送到数据库
【发布时间】:2018-04-26 10:27:12
【问题描述】:

我一直在尝试掌握 C#/.NET 和 UWP 应用程序。目前我正在尝试关注this guide 来完成对我的数据库的CRUD 操作。到目前为止一切都很好,但是当我来到我想要创建的部分时,我遇到了一些麻烦。下面的代码是我创建一个新对象并尝试将其发布到数据库的地方。在这种情况下,作品就是一本书。

var newPiece = new Piece
{
    PieceTitle = Title.Text,
    PieceAuthor = Author.Text,
    PieceIsbn = Isbn.Text,
    PieceDescription = Description.Text
};

using (var client = new HttpClient())
{
    var content = JsonConvert.SerializeObject(newPiece);

    Task task = Task.Run(async () =>
    {
        var data = new HttpFormUrlEncodedContent(
            new Dictionary<string, string>
            {
                ["value"] = content
            });
        await client.PostAsync(App.BaseUri, data);
    });

    task.Wait();
}

这里的问题是因为我同时使用HttpClient()HttpFormUrlEncodedContent() VS 告诉我HttpClient() 是“一个模棱两可的引用”,我需要指定它是属于System.Net.Http; 还是@987654327 @。如果我选择 System.Net.Http,那么它会告诉我 PostAsync() 中的参数 1“无法从 'System.Uri' 转换为 'string'”,并且参数 2“无法转换从 'Windows.Web.Http.HttpFormUrlEncodedContent' 到 'System.Net.Http.HttpContent'"

如果我尝试让HttpClient() 使用Windows.Web.Http;,那么它在编译时不会给我任何错误,但是在创建并发布对象后,它在我的表中显示为 null

【问题讨论】:

    标签: c# uwp dotnet-httpclient


    【解决方案1】:

    System.Net.Http 命名空间有 FormUrlEncodedContent。你可以使用它。

    var newPiece = new Piece
    {
        PieceTitle = Title.Text,
        PieceAuthor = Author.Text,
        PieceIsbn = Isbn.Text,
        PieceDescription = Description.Text
    };
    
    using (var client = new System.Net.Http.HttpClient()) {
        var json = JsonConvert.SerializeObject(newPiece);            
        var content = new System.Net.Http.FormUrlEncodedContent(
            new Dictionary<string, string> {
                ["value"] = json
            });
        await client.PostAsync(App.BaseUri, content);           
    }
    

    还应尽量避免混合使用异步调用和阻塞调用,例如 .Wait().Result,因为它们可能导致死锁。

    还表示接收时数据为空。这可能表明正在使用的格式与预期的格式不匹配。

    尝试使用其他格式。例如以下发送 JSON 内容。

    using (var client = new System.Net.Http.HttpClient()) {
        var json = JsonConvert.SerializeObject(newPiece);            
        var content = new System.Net.Http.StringContent(json, Encoding.UTF8, "application/json");
        await client.PostAsync(App.BaseUri, content);           
    }
    

    【讨论】:

    • VS 没有给我在FormUrlEncodedContent 上使用System.Net.Http 的选项。如果我尝试用System.Net.Http.HttpFormUrlEncodedContent 强制它,它仍然无法编译。它告诉我我可以“在新文件中生成类 'HttpFormUrlEncodedContent'”。
    • 没关系。我尝试像您一样设置它,它消除了我遇到的错误。但是它现在告诉我 Button_Click 需要是异步的,所以它现在读取 private async void Button_Click 但它仍然给我 null 数据...
    • @PQuix 显示数据发送到的目标操作/端点的定义。
    • 当你说it still gives me null on the data时显示代码
    • @PQuix 你确定你调用的服务需要表单数据而不是 JSON?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 2013-07-20
    • 2021-03-27
    相关资源
    最近更新 更多