最近一个WPF项目需要改写成android项目,思路是在asp.net项目中编写一个通用接口,便于其它平台下调用数据。刚接触到这些东西的时候完全是一头雾水,最根本的原因是不明白网站中的一个网页,为什么其它项目就可以访问它,并获取数据。带着疑问在asp.net项目编写一个简单的数据接口,并新建一个小winform项目直接访问它。本文涉及到的知识点有:在asp.net项目中如何编写一个数据接口;使用反射辨别响应的方法;以及如何获取接口的数据。这里仅仅是介绍如何使用它们,而不讲述使用它们的基本原理,一是本人道行浅薄对基本原理不了解,害怕随便书写误导后人;二是如果阐述其基本原理,势必需要花费大量时间,奈何时间有限。将来如果上述两个条件满足,必会在最下面做出论述,因为这对自己的进步也是一个肯定。闲话少说,开始正文。

  主要内容:

  1、asp.net项目下编写数据接口

  2、使用反射分辨调用方法

  3、新建一个winform项目测试接口的正确性

1、在asp.net项目下编写一简单接口

编写一个方法,构造一个json字符串Response即可。

  1. private void ExamInfoLogin()
  2. {
  3. string aa = "";
  4. string bb = "";
  5.  
  6. string roomName = Request.Form["RoomName"];
  7. if (roomName == "")
  8. {
  9. aa = "";
  10. }
  11.  
  12. StringBuilder jsonStringBuilder = new StringBuilder();
  13. jsonStringBuilder.Append("{");
  14. jsonStringBuilder.Append("\"UName\":\"").Append(aa).Append("\",");
  15. jsonStringBuilder.Append("\"Password\":\"").Append(bb).Append("\"");
  16. jsonStringBuilder.Append("}");
  17. Response.Write(jsonStringBuilder.ToString());
  18. }

2、使用反射选取调用方法

假设在aspx页面中有很多方法,而在使用过程中往往仅需要调用其中的某一个方法,此处用反射选取调用方法。

反射过程中使用的常量:

  1. private const string PAGE_PATH_INFO = "/AppDataInterface/ExamLogin.aspx";//页面
  2. private const string ASSEMBLY_NAME = "OSCEWEB";//程序集
  3. private const string CLASS_NAME = "OSCEWEB.AppDataInterface.ExamLogin";//类名

重写OnInit方法:

  1. protected override void OnInit(EventArgs e)
  2. {
  3. string pathInfo = Request.Params["PATH_INFO"];
  4. if (pathInfo.StartsWith(PAGE_PATH_INFO + "/"))
  5. {
  6. string[] nameList = pathInfo.Substring(PAGE_PATH_INFO.Length + ).Split('/');
  7. if (nameList.Length < )
  8. {
  9. Response.End();
  10. return;
  11. }
  12.  
  13. try
  14. {
  15. Assembly assembly = Assembly.Load(ASSEMBLY_NAME);
  16. Type type = assembly.GetType(CLASS_NAME);
  17. MethodInfo method = type.GetMethod(nameList[], System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
  18. method.Invoke(this, null);
  19. }
  20. catch (Exception ex)
  21. {
  22. Response.End();
  23. return;
  24. }
  25. }
  26. }

在Page_Load方法中添加:

  1. if (Request.Params["PATH_INFO"].StartsWith(PAGE_PATH_INFO + "/"))
  2. {
  3. Response.End();
  4. }

3、新建一Winform项目,访问asp.net中数据接口

发布asp.net项目,网址:http://192.168.4.22:8005

1)无需向数据接口传递数据:

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. string strURL = "http://192.168.4.22:8005/AppDataInterface/ExamLogin.aspx/ExamInfoLogin";
  4. request = (System.Net.HttpWebRequest)WebRequest.Create(strURL);
  5. response = (System .Net.HttpWebResponse )request .GetResponse ();
  6.  
  7. System.IO.StreamReader streamReader = new System.IO.StreamReader(response.GetResponseStream(), Encoding.UTF8);
  8. string responseText = streamReader.ReadToEnd();
  9. streamReader.Close();
  10. MessageBox.Show(responseText);
  11. }

得到的数据是:{"UName":"8","Password":"9"}

2)以post方式向数据接口传递数据,获取接口数据

  1. private void button2_Click(object sender, EventArgs e)
  2. {
  3. string strURL = "http://192.168.4.22:8005/AppDataInterface/ExamLogin.aspx/ExamInfoLogin";
  4.  
  5. request = (System.Net.HttpWebRequest)WebRequest.Create(strURL);
  6. request.Method = "POST";
  7. request.ContentType = "application/x-www-form-urlencoded";
  8. string param = "RoomName=806";
  9. ASCIIEncoding encoding = new ASCIIEncoding ();
  10. byte[] data = encoding.GetBytes(param);
  11. request.ContentLength = data.Length;
  12. System.IO.Stream stream = request.GetRequestStream();
  13. stream.Write(data, , data.Length);
  14. stream.Close();
  15.  
  16. response = (System.Net.HttpWebResponse)request.GetResponse();
  17. System.IO.StreamReader streamReader = new System.IO.StreamReader(response.GetResponseStream(), Encoding.UTF8);
  18. string responseText = streamReader.ReadToEnd();
  19. streamReader.Close();
  20. MessageBox.Show(responseText);
  21. }

得到的数据:{"UName":"7","Password":"9"}

、、

  1. string url = System.Configuration.ConfigurationSettings.AppSettings["GetHisOrderUrl"];
  2. string strXml = GetHisOrderXml(hisOrder);
  3.  
  4. System.Net.HttpWebRequest request = (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url);
  5. request.Method = "POST";
  6. request.ContentType = "text/xml;charset=utf-8";
  7. byte[] data = Encoding.UTF8.GetBytes(strXml);
  8. request.ContentLength = data.Length;
  9. request.Headers["SOAPAction"] = "http://tempuri.org/IRouterService/RunService";
  10. System.IO.Stream stream = request.GetRequestStream();
  11. stream.Write(data, , data.Length);
  12. stream.Close();
  13.  
  14. System.Net.HttpWebResponse response = (System.Net.HttpWebResponse) request.GetResponse();
  15. System.IO.StreamReader streamReader = new System.IO.StreamReader(response .GetResponseStream(),Encoding.UTF8);
  16. string responseStr = streamReader.ReadToEnd();
  17. streamReader.Close();

4、总结

  按照上述介绍的一些方法确实能完成项目,但是对其为什么该如此还是充满疑惑,总感觉心中无底、战战兢兢,希望有高手可以对小弟指点一二,不胜感激。

附加:

1、post图片上传到服务器中:

  1. public void UploadImage(string imgPath)
  2. {
  3. var postUrl = string.Empty;
  4.  
  5. HttpWebRequest request = WebRequest.Create(postUrl) as HttpWebRequest;
  6. request.AllowAutoRedirect = true;
  7. request.Method = "POST";
  8.  
  9. string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
  10. request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
  11. byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
  12. byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
  13.  
  14. int pos = imgPath.LastIndexOf("\\");
  15. string fileName = imgPath.Substring(pos + );
  16.  
  17. //请求头部信息
  18. StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", fileName));
  19. byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());
  20.  
  21. FileStream fs = new FileStream(imgPath, FileMode.Open, FileAccess.Read);
  22. byte[] bArr = new byte[fs.Length];
  23. fs.Read(bArr, , bArr.Length);
  24. fs.Close();
  25.  
  26. Stream postStream = request.GetRequestStream();
  27. postStream.Write(itemBoundaryBytes, , itemBoundaryBytes.Length);
  28. postStream.Write(postHeaderBytes, , postHeaderBytes.Length);
  29. postStream.Write(bArr, , bArr.Length);
  30. postStream.Write(endBoundaryBytes, , endBoundaryBytes.Length);
  31. postStream.Close();
  32.  
  33. WebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
  34. System.IO.StreamReader streamReader = new System.IO.StreamReader(response.GetResponseStream(), Encoding.UTF8);
  35. string responseText = streamReader.ReadToEnd();
  36. streamReader.Close();
  37. MessageBox.Show(responseText);
  38. }

2、

Winform项目调用asp.net数据接口的更多相关文章

  1. Winform实现调用asp.net数据接口实例

    本文实例讲述了Winform实现调用asp.net数据接口的方法,分享给大家供大家参考.具体实现方法如下: 一.问题: 最近一个WPF项目需要改写成android项目,思路是在asp.net项目中编写 ...

  2. 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  3. JAVA 项目 调用外部的WebSerivce接口,入门实例 (一)

    前言: 第一次接触WebService,工作需要,调用外部的WebService接口,所以暂时我这里不考虑发布,做个记录,待以后回来可以看看,只是最初级的,所以有何不好.不对的地方,欢迎看到的同僚给予 ...

  4. 循序渐进开发WinForm项目(6)--开发使用混合式Winform模块

    1.Winform数据访问模式定义 传统的Winform程序模块:用于传统的数据库通讯获取数据,这种方式获取数据,方便快捷,可以用于常规的业务系统的场景,用于单机版软件或者基于局域网内的业务系统软件. ...

  5. 使用Asp.net WebAPI 快速构建后台数据接口

    现在的互联网应用,无论是web应用,还是移动APP,基本都需要实现非常多的数据访问接口.其实对一些轻应用来说Asp.net WebAPI是一个很快捷简单并且易于维护的后台数据接口框架.下面我们来快速构 ...

  6. MVC项目实践,在三层架构下实现SportsStore-09,ASP.NET MVC调用ASP.NET Web API的查询服务

    ASP.NET Web API和WCF都体现了REST软件架构风格.在REST中,把一切数据视为资源,所以也是一种面向资源的架构风格.所有的资源都可以通过URI来唯一标识,通过对资源的HTTP操作(G ...

  7. Asp.Net Core基于JWT认证的数据接口网关Demo

    近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求用Aps.Net Core做数据网关服务且基于JWT认证实现对 ...

  8. 关于C# winform怎么调用webapi来获取到json数据

    C/S系统也可以和B/S系统一样实现“前后端分离”,那这样写winform就相当于纯粹的前端页面了,然后再单独部署一个webapi项目,通过api调用数据库进行数据的操作,有利于维护和数据安全性的提高 ...

  9. ABP开发框架前后端开发系列---(5)Web API调用类在Winform项目中的使用

    在前面几篇随笔介绍了我对ABP框架的改造,包括对ABP总体的介绍,以及对各个业务分层的简化,Web API 客户端封装层的设计,使得我们基于ABP框架的整体方案越来越清晰化, 也越来越接近实际的项目开 ...

随机推荐

  1. uva10098 Generating Fast, Sorted Permutation

    #include"iostream"#include"stdio.h"#include"string.h"#include"alg ...

  2. 记linux终端下怎样退出>

    敲命令时候,敲错了,进入了>的提示下,怎么也退不出了.查了资料是按ctrl+c或者ctr+d都能退出

  3. MAC 环境 ionic build android 命令在"Downloading http://services.gradle.org/distributions/gradle-2.13-all.zip"卡住问题

    如题: 环境 node: 4.5.0,npm:2.15.9,cordova :6.3.1, ionic:2.1.0 在ionic build android 命令执行时,会去这个网址下载 gradel ...

  4. CSS兼容性

    1,浮动 ie6中,设置浮动的元素,width自动包裹内容了.通常我们要设定一下这个元素的宽度 子元素浮动父容器高度不能自适应的CSS解决方法 网页前端工作者经常会遇到子元素设置float浮动后导致父 ...

  5. jquery选中将select下拉框中一项后赋值给text文本框

    jquery选中将select下拉框中一项后赋值给text文本框,出现无法将第一个下拉框的value赋值给文本框 因为select默认选中第一项..在选择第一项时,便导致无法激发onchange事件. ...

  6. Moving in Unity

    转自:http://angryant.com/2014/03/07/Moving-in-Unity/ ,详细描述了物体在unity中移动的几种方式,并且给出了代码描述,对加深对Unity理解很有帮助, ...

  7. 【IOS笔记】Views

    Views Because view objects are the main way your application interacts with the user, they have many ...

  8. Bootstrap页面布局20 - BS缩略图

    <div class='container-fluid'> <h2 class='page-header'>Bootstrap 缩略图</h2> <ul cl ...

  9. PHP数组常用函数分类整理

    一.数组操作的基本函数数组的键名和值array_values($arr);  获得数组的值array_keys($arr);  获得数组的键名array_flip($arr);  数组中的值与键名互换 ...

  10. Cluster analysis

    https://en.wikipedia.org/wiki/Cluster_analysis Cluster analysis or clustering is the task of groupin ...