Xamarin.Forms引用WCF仅生成异步方法 如何实现登录并获取返回结果
解决方法
修正WCF异步调用逻辑
目前新版本的WCF连接服务工具默认仅生成异步调用方法,官方不再推荐同步调用WCF服务的方式,直接使用异步方法即可。你之前使用.Result的写法在Xamarin UI线程中极易引发死锁,需要改为async/await写法,修改后的按钮点击事件代码如下:
private async void SignIn_Clicked(object sender, EventArgs e) { // 先做输入非空校验 if(string.IsNullOrWhiteSpace(username.Text) || string.IsNullOrWhiteSpace(password.Text)) { await DisplayAlert("提示", "用户名或密码不能为空", "确定"); return; } ServiceReference1.IuserloginClient cs = new ServiceReference1.IuserloginClient(); string user_name = username.Text; string pass = password.Text; try { // 异步调用WCF服务 ServiceReference1.loginResponse response = await cs.loginAsync(user_name, pass); // 从返回结果中获取服务端返回的DataTable var resultDt = response.Body.loginResult; // 判断登录结果:DataTable行数大于0说明存在匹配的用户 if(resultDt != null && resultDt.Rows.Count > 0) { // 登录成功逻辑,比如跳转页面 await DisplayAlert("提示", "登录成功", "确定"); // 示例跳转首页: await Navigation.PushAsync(new HomePage()); } else { await DisplayAlert("提示", "用户名或密码错误", "确定"); } } catch(Exception ex) { // 捕获服务调用异常,比如网络错误、服务不可用等 await DisplayAlert("错误", $"登录调用失败:{ex.Message}", "确定"); } }
可选优化建议
- WCF服务端直接返回DataTable的跨平台序列化兼容性较差,建议改为返回自定义用户实体类或者直接返回bool类型的登录结果,降低序列化失败风险、减少数据传输体积
- 服务端的
SqlConnection、SqlCommand、SqlDataAdapter等数据库操作对象请用using语句包裹,实现使用后自动释放资源,避免资源泄漏 - 不要在数据库中存储明文密码,建议存储加盐后的哈希值,登录校验时对输入密码做相同哈希计算后再和数据库存储值比对,提升账号安全性
内容的提问来源于stack exchange,提问作者rana hd
相关产品推荐
相关产品推荐

