如何通过Web服务实现Xamarin.Forms应用与SQL Server数据库连接?
为什么不直接在Xamarin.Forms里连SQL Server?
直接把数据库凭证硬编码在客户端风险极高——APK/IPA一旦被反编译,数据库账号密码会直接泄露,任何人都能随意操作你的SQL Server。而且移动网络环境不稳定,长连接容易出现异常,SQL Server的端口也可能被运营商屏蔽,用户大概率无法正常连接。
Web服务的工作原理
简单来说就是在SQL Server和移动APP之间加一层中间服务:
- 移动APP仅与Web服务交互,发送HTTP请求(GET/POST/PUT/DELETE等)
- Web服务负责接收请求、验证身份、执行SQL操作,将结果整理成JSON格式返回给APP
- 全程由Web服务与SQL Server保持安全连接,APP完全接触不到数据库凭证
实现步骤(以ASP.NET Core Web API为例)
搭建Web API项目
新建ASP.NET Core Web API项目,这层服务作为数据访问的中间层。在Web API中实现数据访问
将你原有的数据库连接逻辑迁移到Web API中,比如创建数据访问类:using System.Data; using System.Data.SqlClient; using Microsoft.Extensions.Configuration; namespace YourWebApi.Data { public class DbService { private readonly string _connectionString; public DbService(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConnection"); } public DataTable ExecuteQuery(string query) { using var conn = new SqlConnection(_connectionString); conn.Open(); using var cmd = new SqlCommand(query, conn); using var adapter = new SqlDataAdapter(cmd); var dt = new DataTable(); adapter.Fill(dt); return dt; } // 封装增删改方法,比如执行非查询语句的ExecuteNonQuery public int ExecuteNonQuery(string query) { using var conn = new SqlConnection(_connectionString); conn.Open(); using var cmd = new SqlCommand(query, conn); return cmd.ExecuteNonQuery(); } } }然后在
appsettings.json中配置连接字符串(仅在服务器端存储,安全性高):{ "ConnectionStrings": { "DefaultConnection": "Data Source=你的服务器名;Initial Catalog=你的数据库名;User ID=账号;Password=密码" } }编写API接口
创建Controller处理APP的请求,比如获取数据的接口:using Microsoft.AspNetCore.Mvc; using YourWebApi.Data; namespace YourWebApi.Controllers { [ApiController] [Route("api/[controller]")] public class DataController : ControllerBase { private readonly DbService _dbService; public DataController(DbService dbService) { _dbService = dbService; } [HttpGet("get-users")] public IActionResult GetUsers() { var data = _dbService.ExecuteQuery("SELECT * FROM Users"); return Ok(data); } [HttpPost("add-user")] public IActionResult AddUser(string userName, string email) { var affectedRows = _dbService.ExecuteNonQuery($"INSERT INTO Users(UserName, Email) VALUES('{userName}', '{email}')"); return Ok(affectedRows > 0 ? "添加成功" : "添加失败"); } } }在Xamarin.Forms中调用API
使用HttpClient发送请求获取数据,比如封装API调用服务:using System.Net.Http; using System.Threading.Tasks; using Newtonsoft.Json; namespace MVVMdemo.Services { public class ApiService { private readonly HttpClient _httpClient; public ApiService() { _httpClient = new HttpClient(); _httpClient.BaseAddress = new Uri("https://你的WebAPI域名/api/"); } public async Task<T> GetDataAsync<T>(string endpoint) { var response = await _httpClient.GetAsync(endpoint); response.EnsureSuccessStatusCode(); var jsonContent = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject<T>(jsonContent); } public async Task<string> PostDataAsync(string endpoint, FormUrlEncodedContent content) { var response = await _httpClient.PostAsync(endpoint, content); response.EnsureSuccessStatusCode(); return await response.Content.ReadAsStringAsync(); } } }之后在ViewModel中调用该服务,将数据绑定到UI即可。
额外注意事项
- 必须给Web API添加身份验证,比如JWT,防止无关人员随意调用接口
- 禁止将SQL语句从APP传到Web API,要在Web API中封装好业务方法,APP仅传递参数,避免SQL注入风险
- 移动端要做好网络异常处理,比如断网、超时情况,给用户友好提示
内容的提问来源于stack exchange,提问作者macecahu
相关产品推荐
相关产品推荐

