Winform与WebAPI混合架构是一种将传统桌面应用程序与现代Web服务相结合的开发模式。在这种架构中,Winform作为客户端界面,通过HTTP协议与后端的WebAPI服务进行通信,实现业务逻辑和数据交互。
// 创建HttpClient实例(建议单例复用)
private static readonly HttpClient _httpClient = new HttpClient();
// 设置基础地址
_httpClient.BaseAddress = new Uri("https://api.example.com/");
// 构建请求内容(以POST为例)
var requestData = new
{
UserId = 123,
Action = "GetUserDetails"
};
// 序列化为JSON
string jsonContent = JsonConvert.SerializeObject(requestData);
var httpContent = new StringContent(jsonContent, Encoding.UTF8, "application/json");
try
{
// 发送请求并获取响应
HttpResponseMessage response = await _httpClient.PostAsync("user/details", httpContent);
// 确保响应成功
response.EnsureSuccessStatusCode();
// 读取响应内容
string responseBody = await response.Content.ReadAsStringAsync();
// 反序列化响应
var result = JsonConvert.DeserializeObject<UserDetails>(responseBody);
// 更新UI(需要使用Invoke跨线程访问)
this.Invoke((MethodInvoker)delegate {
txtUserName.Text = result.UserName;
txtEmail.Text = result.Email;
});
}
catch (HttpRequestException ex)
{
MessageBox.Show($"请求失败: {ex.Message}");
}
Winform调用WebAPI应采用异步模式,避免阻塞UI线程:
private async void btnGetData_Click(object sender, EventArgs e)
{
await GetDataFromApiAsync();
}
由于HTTP响应在后台线程完成,更新UI需要使用Control.Invoke:
this.Invoke((MethodInvoker)delegate {
// UI更新代码
});
需要处理多种异常情况:
原因:HTTP响应回调在非UI线程,直接操作控件会引发跨线程异常。
解决方案:
this.Invoke((MethodInvoker)delegate {
// 安全更新UI
});
原因:网络状况不佳或API响应慢。
解决方案:
_httpClient.Timeout = TimeSpan.FromSeconds(30); // 设置合理超时
原因:开发环境使用自签名证书。
解决方案(仅限开发环境):
var handler = new HttpClientHandler
{
ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true
};
var httpClient = new HttpClient(handler);
通过这种架构,Winform应用可以充分利用现代Web服务的优势,同时保持传统桌面应用的丰富交互体验。