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

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)
{
    // 原有逻辑
}

其他必要优化

  1. 修复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;
}
  1. 避免UI线程死锁
    WPF的UI线程存在同步上下文,直接调用异步方法的.Result或者.Wait()会大概率出现死锁,所有异步HTTP请求都要用await,且非UI更新的异步逻辑加ConfigureAwait(false),需要更新UI的时候再通过Dispatcher切回UI线程操作。

内容的提问来源于stack exchange,提问作者Johnny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:45:03