You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:54:00