C# Winform调用ASP.NET Web API示例:反射路由与HTTP交互
本文将展示如何构建一个基于ASP.NET的通用数据接口,利用反射技术实现按需调用不同功能方法,并在C# Winform客户端中使用标准HTTP库进行数据交互,涵盖无参数GET请求及含参POST请求两种场景。
目标与原理
为实现多平台共享数据逻辑,需在ASP.NET项目中定义一组服务方法,并通过统一的入口点(如 .aspx 或 .ashx)对外暴露。核心思路是将具体的业务方法隐藏在后台代码中,前端或客户端仅需提供方法名称作为路径参数,由服务器端的反射引擎解析并执行对应函数,从而避免为每个操作编写独立的处理文件。
准备工作
- ASP.NET项目环境:用于承载接口逻辑与反射调度中心。
- Winform项目环境:用于模拟外部调用者,测试接口连通性与数据返回格式。
- 基础依赖:确保两个项目均能引用
System.Net、System.Reflection等命名空间。
第1步:ASP.NET端编写业务方法与常量配置
目的:定义待调用的业务逻辑,并声明用于反射解析的路径前缀、程序集名称及类名常量。
操作:
- 在
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";
- 编写业务方法:创建一个私有方法,用于生成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中携带的方法名,通过反射实例化类并调用相应方法。
操作:
- 重写
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;
}
}
}
- 保护
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数据交互的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













