Мобильное приложение Azure - UpdateAsync - ожидание активации «Ошибка» - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть два проекта

Первое - Мобильное приложение с Xamarin.Forms

Второе - Приложение Windows Form

и оба имеют тот же API, который был создан с использованием мобильного приложения Azure.

в форме Windows , когда я пытаюсь обновить строку в базе данных с помощью.Net HttpClient с использованием следующего кода:

private void BtnUpdateUser_Click(object sender, EventArgs e)
    {
        UserRepository userRepository = new UserRepository();
        var user = userRepository.GetAllUsers().FirstOrDefault(w => w.UserId == 1)

        user.UserName = "UpdateUserName";

        var result = userRepository.UpdateUser(user.Id, user);
    }

В классе UserRepository У меня есть метод с именем UpdateUser

public User UpdateUser(string id, User user)
    {
        var result = Task.Run(async () => await azureServices.UpdateAsync(id, user)).Result;
        return result;
    }

InКласс AzureServices У меня есть метод с именем UpdateAsync

public async Task<T> UpdateAsync(string id, T instance)
    {

        var Uri= new Uri(baseAddress + id + zumoAddition); //"http://localhost:55040/tables/User/48D68C86-6EA6-4C25-AA33-223FC9A27959?zumo-api-version=2.0.0
        var content = JsonConvert.SerializeObject(instance);
        await _httpClient.PatchAsync(Uri, new StringContent(content, Encoding.UTF8, "application/json"));

        return instance;
    }

PatchAsync - это метод расширения для выполнения запроса PATCHс Windows.Web.Http.HttpClient

public static async Task<HttpResponseMessage> PatchAsync(this HttpClient Client, Uri requestUri, HttpContent contnet)
    {

        var method = new HttpMethod("PATCH");
        var httpRequestMessage = new HttpRequestMessage(method, requestUri)
        {
            Content = contnet
        };

        var httpResponseMessage = new HttpResponseMessage();
        try
        {
            httpResponseMessage = await Client.SendAsync(httpRequestMessage);
        }
        catch (TaskCanceledException e)
        {
            Debug.WriteLine("Error: " + e.ToString());
        }
        return httpResponseMessage;
    }

в этой строке httpResponseMessage = await Client.SendAsync(httpRequestMessage); Я получаю эту ошибку:

{StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { x-zumo-server-version: net-2.0.0 X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcQW5hc1xEZXNrdG9wXFB1cmNoYXNlT3JkZXJzQmFja2VuZFxQdXJjaGFzZU9yZGVyc0JhY2tlbmRcdGFibGVzXFVzZXJcNTA1NzdBOTMtOEEzRi00OTEwLUJBOEYtM0MwMkMyOUFDMDUx?= Date: Thu, 29 Nov 2018 10:20:59 GMT Server: Microsoft-IIS/10.0 X-Powered-By: ASP.NET Content-Length: 188 Content-Type: application/json; charset=utf-8 }}

Inбэкэнд У меня есть контроллер с методом Patch:

public Task<User> PatchUser(string id, Delta<User> patch)
    {
         return UpdateAsync(id, patch);
    }

, когда я пытаюсь отладить бэкэнд, я получаю это:

Id = 179, Status = WaitingForActivation, Method = "{null}", Result = "{Not yet computed}"

enter image description here

Вопрос: Как мне избавиться от этой ошибки и почему она появляется.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

На стороне клиента (форма Windows) вы смешиваете асинхронные и блокирующие вызовы, такие как .Result, что может привести к тупикам.

Поскольку вы используете HttpClient, вы должны стремиться поддерживать асинхронный код на всем протяжении.

UserRepository необходимо обновить, чтобы разрешить неблокирующие асинхронные вызовы

public Task<User> UpdateUserAsync(string id, User user) {
    return azureServices.UpdateAsync(id, user);
}

Обработчики событий допускают асинхронные вызовы, поэтому необходимо реорганизовать их на

private asyc void BtnUpdateUser_Click(object sender, EventArgs e) {
    UserRepository userRepository = new UserRepository();
    var user = userRepository.GetAllUsers().Where(w => w.UserId == 1).FirstOrDefault();

    user.UserName = "UpdateUserName";

    var result = await  userRepository.UpdateUserAsync(user.Id, user);
}

Это должно помочь уменьшить любые взаимоблокировки, которые могут возникнуть на стороне клиента.

Наback-end действие TableController ожидает Delta<User>, что в зависимости от того, что отправлено с клиента, может быть отформатировано неправильно.

Клиент отправляет в виде содержимого обычный aplication/json User, который может неправильно привязываться к Delta<User>, который ожидает обработки только тех изменений, которые будут внесены в модель.

0 голосов
/ 30 ноября 2018

Как я могу избавиться от этой ошибки и почему она появляется.

Вы можете упростить свой код, вызвав и дождавшись следующего отдельного оператора.

public async Task<User> PatchUser(string id, Delta<User> patch)
{
    return await UpdateAsync(id, patch);
}

Для получения дополнительной информации, пожалуйста, обратитесь к Асинхронное программирование с асинхронным и ожидающим (C #)

...