XAML - PostAsync将空数据发送到数据库

时间:2018-04-26 10:27:12

标签: c# uwp dotnet-httpclient

我一直在努力掌握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;Windows.Web.Http;。如果我选择System.Net.Http,那么它会告诉我PostAsync()中的参数1无法从'System.Uri'转换为'string'”,并且该参数2“< em>无法从'Windows.Web.Http.HttpFormUrlEncodedContent'转换为'System.Net.Http.HttpContent'“

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

1 个答案:

答案 0 :(得分: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);           
}