应用程序突然出现超时异常和内部服务器错误

App sudden got a Timeout exception and Internal server error

我的 xamarin 应用程序上的注册和登录功能突然停止工作。它有时会给出:

未处理的异常:Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException:发生

其他时间:

未处理的异常:Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException:请求无法完成。 (内部服务器错误)发生

我没有更改这些页面上的任何内容以影响它们。唯一发生的事情是我的 azure 订阅过期了,我续订了。除非缺少某些设置,否则连接仍然相同。

我确定这两个页面上的问题是一样的,所以我将在这里显示我的注册页面。如果您需要查看我的登录信息,请告诉我。

编辑 1:我添加了一个 try/catch,它总能成功。

编辑 2:应用程序可能在其主线程上做了太多工作。

出现在日志里,不知道为什么突然就一直报这些异常,我试过都没有任何改善。

编辑 3:尝试过清理构建、卸载、重新安装,但现在我不知所措。直到今天它都运行良好,现在我遇到了上面提到的这些问题,但我似乎没有解决它。

        EditText Username = FindViewById<EditText>(Resource.Id.txtUsername);
        EditText Password = FindViewById<EditText>(Resource.Id.txtPassword);
        EditText ConfirmPassword = FindViewById<EditText>(Resource.Id.txtConfirmPassword);
        if (Password.Text == ConfirmPassword.Text)
        {
            try
            {
                string hashedPassword = PasswordStorage.CreateHash(Password.Text);
                string userName = Username.Text.Trim();
                users newU = new users { username = userName, password = hashedPassword };
                List<users> allUsers = await Client.GetTable<users>().ToListAsync();
                Toast.MakeText(this, "Awaits table", ToastLength.Short).Show();
                users u = allUsers.FirstOrDefault(x => x.username == newU.username);
                if (u == null)
                {
                    DBHelper.InsertNewUser(newU);
                    Toast.MakeText(this, "User " + newU.username + " created! You can now log in!", ToastLength.Short).Show();
                    StartActivity(typeof(MainActivity));
                }
                else
                {
                    Toast.MakeText(this, "User " + u.username + " already exists!", ToastLength.Short).Show();
                }
            }
            catch (Exception)
            {
                Toast.MakeText(this, "Time out", ToastLength.Short).Show();
            }

        }

对于您的代码,您可以针对在线 table 优化查询,如下所示:

var client = new MobileServiceClient("https://<your-app-name>.azurewebsites.net");
var users = await client.GetTable<users>().Where(u=>u.username == newU.username).ToListAsync();
if(users.Any())
{
   //user exists
}
else
{
   //add new user
}

对于您的场景,我建议您Enable diagnostics logging 捕获详细的错误。对于 C# 后端,您可以在 Startup.MobileApp.cs 文件下指定 config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;,然后您可以在响应中检索详细的错误。并且你需要调试你的代码并使用fiddler来捕获网络痕迹,错误可能是由Client.GetTable<users>().ToListAsync()DBHelper.InsertNewUser(newU)抛出的,所以你需要自己排查。如果您无法解决此问题,您可以使用您尝试过的更详细的步骤和您检索到的详细请求跟踪来更新问题,以便我们缩小此问题的范围。

此外,您可以关注 adrian hall 关于 The Mobile Client 的书。