XAML - PostAsync отправляет нулевые данные в базу данных - PullRequest
0 голосов
/ 26 апреля 2018

Я пытался понять, как работают приложения на C # / .NET и UWP. В настоящее время я пытаюсь следовать этому руководству , чтобы завершить операции 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, то это говорит мне, что Аргумент 1 в PostAsync() " не может быть преобразован из 'System.Uri' в 'строку' ", и что Аргумент 2 " не может преобразовать из «Windows.Web.Http.HttpFormUrlEncodedContent» в «System.Net.Http.HttpContent»"

Если я попытаюсь разрешить HttpClient() использовать Windows.Web.Http;, то это не даст мне никаких ошибок при компиляции, но после того, как объект будет создан и опубликован, он отобразится как null в моих таблицах.

1 Ответ

0 голосов
/ 26 апреля 2018

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);           
}
...