C# Winform调用ASP.NET Web API示例:反射路由与HTTP交互

Luna
Luna
发布时间:2026-10-14 | 3人浏览过
原创

本文将展示如何构建一个基于ASP.NET的通用数据接口,利用反射技术实现按需调用不同功能方法,并在C# Winform客户端中使用标准HTTP库进行数据交互,涵盖无参数GET请求及含参POST请求两种场景。

目标与原理

为实现多平台共享数据逻辑,需在ASP.NET项目中定义一组服务方法,并通过统一的入口点(如 .aspx 或 .ashx)对外暴露。核心思路是将具体的业务方法隐藏在后台代码中,前端或客户端仅需提供方法名称作为路径参数,由服务器端的反射引擎解析并执行对应函数,从而避免为每个操作编写独立的处理文件。

准备工作

  1. ASP.NET项目环境:用于承载接口逻辑与反射调度中心。
  2. Winform项目环境:用于模拟外部调用者,测试接口连通性与数据返回格式。
  3. 基础依赖:确保两个项目均能引用 System.Net、System.Reflection 等命名空间。

第1步:ASP.NET端编写业务方法与常量配置

目的:定义待调用的业务逻辑,并声明用于反射解析的路径前缀、程序集名称及类名常量。

操作:

  1. 在 AppDataInterface/ExamLogin.aspx.cs 文件中定义常量,明确接口的访问根路径、程序集名及完整类名:
private const string PAGE_PATH_INFO = "/AppDataInterface/ExamLogin.aspx";
private const string ASSEMBLY_NAME = "OSCEWEB";
private const string CLASS_NAME = "OSCEWEB.AppDataInterface.ExamLogin";
  1. 编写业务方法:创建一个私有方法,用于生成JSON格式的响应数据。此处模拟了接收参数并修改数据的逻辑:
private void ExamInfoLogin()
{
    string aa = "8";
    string bb = "9";
    string roomName = Request.Form["RoomName"];
    if (roomName == "806")
    {
        aa = "7";
    }
    
    StringBuilder jsonStringBuilder = new StringBuilder();
    jsonStringBuilder.Append("{");
    jsonStringBuilder.Append("\"UName\":\"").Append(aa).Append("\",");
    jsonStringBuilder.Append("\"Password\":\"").Append(bb).Append("\"");
    jsonStringBuilder.Append("}");
    Response.Write(jsonStringBuilder.ToString());
}

第2步:使用反射拦截路径并分发方法

目的:重写页面生命周期中的初始化事件,解析URL中携带的方法名,通过反射实例化类并调用相应方法。

操作:

  1. 重写 OnInit 方法:获取请求路径信息,判断是否匹配预设的前缀。若匹配,则提取方法名并尝试调用:
protected override void OnInit(EventArgs e)
{
    string pathInfo = Request.Params["PATH_INFO"];
    // 检查是否为指定接口路径
    if (pathInfo.StartsWith(PAGE_PATH_INFO + "/"))
    {
        string[] nameList = pathInfo.Substring(PAGE_PATH_INFO.Length + 1).Split('/');
        if (nameList.Length < 1) { Response.End(); return; }

        try
        {
            // 加载程序集与类型
            Assembly assembly = Assembly.Load(ASSEMBLY_NAME);
            Type type = assembly.GetType(CLASS_NAME);
            
            // 获取非公共实例方法
            MethodInfo method = type.GetMethod(nameList[0], System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
            
            // 调用方法
            method.Invoke(this, null);
        }
        catch (Exception ex)
        {
            Response.End();
            return;
        }
    }
}
  1. 保护 Page_Load:在正常加载过程中,如果检测到相同的特殊路径标识,直接结束响应,防止页面HTML内容混入JSON数据:
if (Request.Params["PATH_INFO"].StartsWith(PAGE_PATH_INFO + "/"))
{
    Response.End();
}

第3步:Winform客户端发起HTTP请求

目的:验证接口可用性,分别演示无参GET请求与含参POST请求的数据获取流程。

注意:实际部署时请将测试IP http://192.168.4.22:8005 替换为你的实际服务器地址。

场景A:无需传递参数的GET请求

直接构造URL指向接口及服务方法,读取响应流:

private void button1_Click(object sender, EventArgs e)
{
    string strURL = "http://192.168.4.22:8005/AppDataInterface/ExamLogin.aspx/ExamInfoLogin";
    request = (System.Net.HttpWebRequest)WebRequest.Create(strURL);
    response = (System.Net.HttpWebResponse)request.GetResponse();

    System.IO.StreamReader streamReader = new System.IO.StreamReader(response.GetResponseStream(), Encoding.UTF8);
    string responseText = streamReader.ReadToEnd();
    streamReader.Close();
    MessageBox.Show(responseText); // 预期结果: {"UName":"8","Password":"9"}
}

场景B:以POST方式传递参数

设置请求头与Body,将表单数据编码后发送:

private void button2_Click(object sender, EventArgs e)
{
    string strURL = "http://192.168.4.22:8005/AppDataInterface/ExamLogin.aspx/ExamInfoLogin";
    request = (System.Net.HttpWebRequest)WebRequest.Create(strURL);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    
    string param = "RoomName=806";
    ASCIIEncoding encoding = new ASCIIEncoding();
    byte[] data = encoding.GetBytes(param);
    request.ContentLength = data.Length;
    
    System.IO.Stream stream = request.GetRequestStream();
    stream.Write(data, 0, data.Length);
    stream.Close();

    response = (System.Net.HttpWebResponse)request.GetResponse();
    System.IO.StreamReader streamReader = new System.IO.StreamReader(response.GetResponseStream(), Encoding.UTF8);
    string responseText = streamReader.ReadToEnd();
    streamReader.Close();
    MessageBox.Show(responseText); // 预期结果: {"UName":"7","Password":"9"}
}

完成判断

运行Winform测试项目,点击按钮后若弹出包含正确JSON结构的消息框,且POST请求能根据传入参数改变返回内容,则说明接口构建、反射路由及HTTP通信均已成功实现。

简要总结

通过ASP.NET的反射机制统一封装数据出口,结合Winform的标准网络编程模型,可以高效实现跨平台的数据交互。这种模式避免了重复编写CRUD接口,适合中小型系统的快速集成开发。

以上就是C# Winform调用ASP.NET数据接口实例的详细内容,更多关于C# Winform ASP.NET数据交互的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表