Azure 移动应用程序 - UpdateAsync - 等待激活 "Error"
Azure Mobile App - UpdateAsync - waiting for activation "Error"
我有两个项目
首先是 移动应用 Xamarin.Forms
其次是Windows表格申请
两者都具有使用 Azure 移动应用创建的相同 API。
Windows形式
当我尝试使用以下代码使用 a.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 class 我有一个方法叫做 UpdateUser
public User UpdateUser(string id, User user)
{
var result = Task.Run(async () => await azureServices.UpdateAsync(id, user)).Result;
return result;
}
在 AzureServices class 我有一个方法叫做 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 是 extension method 以 Windows.Web.Http.HttpClient
执行 PATCH
请求
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
}}
在后端我有一个带有 Patch 方法的控制器:
public Task<User> PatchUser(string id, Delta<User> patch)
{
return UpdateAsync(id, patch);
}
当我尝试调试后端时,我得到了这个:
Id = 179, Status = WaitingForActivation, Method = "{null}", Result = "{Not yet computed}"
问题是:我怎样才能摆脱这个错误以及它出现的原因。
How I can get rid of this error and why it appears.
您可以通过在以下单个语句中调用和等待来简化代码。
public async Task<User> PatchUser(string id, Delta<User> patch)
{
return await UpdateAsync(id, patch);
}
在客户端(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);
}
这应该有助于缓解客户端可能发生的任何死锁。
在后端,TableController
操作需要 Delta<User>
,根据从客户端发送的内容,其格式可能不正确。
客户端正在发送一个普通的 aplication/json
User
作为内容,它可能无法正确绑定到 Delta<User>
,后者期望只处理对模型所做的更改。
我有两个项目
首先是 移动应用 Xamarin.Forms
其次是Windows表格申请
两者都具有使用 Azure 移动应用创建的相同 API。
Windows形式 当我尝试使用以下代码使用 a.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 class 我有一个方法叫做 UpdateUser
public User UpdateUser(string id, User user)
{
var result = Task.Run(async () => await azureServices.UpdateAsync(id, user)).Result;
return result;
}
在 AzureServices class 我有一个方法叫做 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 是 extension method 以 Windows.Web.Http.HttpClient
PATCH
请求
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 }}
在后端我有一个带有 Patch 方法的控制器:
public Task<User> PatchUser(string id, Delta<User> patch)
{
return UpdateAsync(id, patch);
}
当我尝试调试后端时,我得到了这个:
Id = 179, Status = WaitingForActivation, Method = "{null}", Result = "{Not yet computed}"
问题是:我怎样才能摆脱这个错误以及它出现的原因。
How I can get rid of this error and why it appears.
您可以通过在以下单个语句中调用和等待来简化代码。
public async Task<User> PatchUser(string id, Delta<User> patch)
{
return await UpdateAsync(id, patch);
}
在客户端(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);
}
这应该有助于缓解客户端可能发生的任何死锁。
在后端,TableController
操作需要 Delta<User>
,根据从客户端发送的内容,其格式可能不正确。
客户端正在发送一个普通的 aplication/json
User
作为内容,它可能无法正确绑定到 Delta<User>
,后者期望只处理对模型所做的更改。