无法访问 Azure 移动应用中 JValue 的子值
Cannot access child value on JValue in Azure Mobile App
我最近使用 Azure 移动应用程序实现了自定义身份验证 - 所有服务器端都工作正常,而且我使用该移动应用程序服务的 Web 应用程序也工作正常。我使用 POSTMAN 和不同的场景详细测试了服务器端,一切正常,直到我尝试 LoginAsync
on Xamarin.
当我在 POSTMAN 中传递电子邮件和密码时,我收到以下响应,清楚地表明它正在工作
但是当我使用 LoginAsync
从我的应用程序发送请求时,出现以下错误。
Cannot access child value on Newtonsoft.Json.Linq.JValue
我发送请求的代码非常简单,如下所示
public async Task<bool> Authenticate()
{
string username = "todo@gmail.com";
string password = "todo";
string message = string.Empty;
var success = false;
var credentials = new JObject
{
["email"] = username,
["password"] = password
};
try
{
MobileServiceUser user = await client.LoginAsync("CustomAuth", credentials);
if (user != null)
{
success = true;
CreateAndShowDialog("OK", "Auth");
}
}
catch (Exception ex)
{
CreateAndShowDialog(ex, "Auth Error");
}
return success;
}
我是这样称呼它的
private MobileServiceClient client;
client = new MobileServiceClient(applicationURL);
await Authenticate();
知道为什么我会收到 Cannot access child value on Newtonsoft.Json.Linq.JValue
错误吗?
干杯
编辑POST
作为解决方法,我暂时将 InvokeApiAsync
与 JObject.FromObject
一起使用,而不是 LoginAsync
await client.InvokeApiAsync("/.auth/login/CustomAuth", JObject.FromObject(credentials), HttpMethod.Post, null);
我仍然不确定为什么 LoginAsync
不起作用 - 在找到解决方案之前,我将继续使用 InvokdeApiAsync
作为解决方法
AFAIK,您对 credentials
的初始化是正确的。对于以下错误:
Cannot access child value on Newtonsoft.Json.Linq.JValue
我通过 POSTMAN 查看了您的测试结果,发现您没有 return userId
给您的客户。 return提供给您的客户的基本属性如下所示:
{
"authenticationToken":"***",
"user":{
"userId":"***"
}
}
当使用MobileServiceClient.LoginAsync
时,客户端SDK会内部调用MobileServiceAuthentication.cs下的LoginAsync()
方法,如下:
JToken authToken = JToken.Parse(response);
// Get the Mobile Services auth token and user data
this.Client.CurrentUser = new MobileServiceUser((string)authToken["user"]["userId"]);
this.Client.CurrentUser.MobileServiceAuthenticationToken = (string)authToken[LoginAsyncAuthenticationTokenKey];
你会发现它会尝试提取user
下的userId
属性来构造MobileServiceUser
实例并赋值给MobileServiceClient.CurrentUser
。
我最近使用 Azure 移动应用程序实现了自定义身份验证 - 所有服务器端都工作正常,而且我使用该移动应用程序服务的 Web 应用程序也工作正常。我使用 POSTMAN 和不同的场景详细测试了服务器端,一切正常,直到我尝试 LoginAsync
on Xamarin.
当我在 POSTMAN 中传递电子邮件和密码时,我收到以下响应,清楚地表明它正在工作
但是当我使用 LoginAsync
从我的应用程序发送请求时,出现以下错误。
Cannot access child value on Newtonsoft.Json.Linq.JValue
我发送请求的代码非常简单,如下所示
public async Task<bool> Authenticate()
{
string username = "todo@gmail.com";
string password = "todo";
string message = string.Empty;
var success = false;
var credentials = new JObject
{
["email"] = username,
["password"] = password
};
try
{
MobileServiceUser user = await client.LoginAsync("CustomAuth", credentials);
if (user != null)
{
success = true;
CreateAndShowDialog("OK", "Auth");
}
}
catch (Exception ex)
{
CreateAndShowDialog(ex, "Auth Error");
}
return success;
}
我是这样称呼它的
private MobileServiceClient client;
client = new MobileServiceClient(applicationURL);
await Authenticate();
知道为什么我会收到 Cannot access child value on Newtonsoft.Json.Linq.JValue
错误吗?
干杯
编辑POST
作为解决方法,我暂时将 InvokeApiAsync
与 JObject.FromObject
一起使用,而不是 LoginAsync
await client.InvokeApiAsync("/.auth/login/CustomAuth", JObject.FromObject(credentials), HttpMethod.Post, null);
我仍然不确定为什么 LoginAsync
不起作用 - 在找到解决方案之前,我将继续使用 InvokdeApiAsync
作为解决方法
AFAIK,您对 credentials
的初始化是正确的。对于以下错误:
Cannot access child value on Newtonsoft.Json.Linq.JValue
我通过 POSTMAN 查看了您的测试结果,发现您没有 return userId
给您的客户。 return提供给您的客户的基本属性如下所示:
{
"authenticationToken":"***",
"user":{
"userId":"***"
}
}
当使用MobileServiceClient.LoginAsync
时,客户端SDK会内部调用MobileServiceAuthentication.cs下的LoginAsync()
方法,如下:
JToken authToken = JToken.Parse(response);
// Get the Mobile Services auth token and user data
this.Client.CurrentUser = new MobileServiceUser((string)authToken["user"]["userId"]);
this.Client.CurrentUser.MobileServiceAuthenticationToken = (string)authToken[LoginAsyncAuthenticationTokenKey];
你会发现它会尝试提取user
下的userId
属性来构造MobileServiceUser
实例并赋值给MobileServiceClient.CurrentUser
。