WPF使用System.Net.Http.HttpClient调用Delete/Post接口报错如何解决
直接修复方案
- 第一处核心错误:删除方法的请求协议与服务端监听协议不匹配
你正常可运行的GetData方法用的是https://localhost:44390/作为BaseAddress,而DeleteByID方法里写的是http://localhost:44390/,44390是典型的HTTPS监听端口,用HTTP请求HTTPS端口会被服务端直接切断连接,就是你遇到的「远程主机强迫关闭了一个现有的连接」错误,直接把Delete方法里的BaseAddress改成HTTPS即可。
修改后的Delete方法参考:
// 建议HttpClient静态化,不要每次请求都实例化,避免端口占用问题 private static readonly HttpClient _httpClient = new HttpClient() { BaseAddress = new Uri("https://localhost:44390/") }; // 按钮点击事件可以用async void public async void DeleteByID(string id) { try { // 加ConfigureAwait(false)避免UI线程死锁 HttpResponseMessage response = await _httpClient.DeleteAsync($"api/Player/{id}").ConfigureAwait(false); response.EnsureSuccessStatusCode(); if (response.IsSuccessStatusCode) { // 回到UI线程更新提示 Application.Current.Dispatcher.Invoke(() => { MessageBox.Show("用户已删除"); }); } else { Application.Current.Dispatcher.Invoke(() => { MessageBox.Show($"错误码:{response.StatusCode}"); }); } } catch (Exception ex) { Application.Current.Dispatcher.Invoke(() => { MessageBox.Show($"请求错误:{ex.Message}"); }); } }
- 第二处路由匹配校验
如果改完协议还是访问不到接口,给Web API的Delete方法加上明确路由属性,避免默认路由规则不匹配:
[HttpDelete] [Route("api/Player/{id}")] // 明确路由匹配规则 public bool DeleteByID(string id) { // 原有逻辑 }
其他必要优化
- 修复Web API的SQL注入与线程安全问题
你当前控制器里的SqlConnection、SqlCommand是类级别的全局变量,多并发请求时会出现线程冲突,且拼接SQL字符串存在严重SQL注入风险,修改为方法内局部变量+参数化查询:
[HttpDelete] [Route("api/Player/{id}")] public bool DeleteByID(string id) { bool isdeleted = false; // 用using自动释放数据库连接资源 using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnection"].ToString())) { try { con.Open(); // 参数化查询避免SQL注入 using (SqlCommand cmd = new SqlCommand("delete from tbl_Player where ID = @Id", con)) { cmd.Parameters.AddWithValue("@Id", id); int res = cmd.ExecuteNonQuery(); isdeleted = res > 0; } } catch { // 建议自行添加日志记录错误,方便后续排查问题 return isdeleted; } } return isdeleted; }
- 避免UI线程死锁
WPF的UI线程存在同步上下文,直接调用异步方法的.Result或者.Wait()会大概率出现死锁,所有异步HTTP请求都要用await,且非UI更新的异步逻辑加ConfigureAwait(false),需要更新UI的时候再通过Dispatcher切回UI线程操作。
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

