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

  主要内容:

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

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

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

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

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

private void ExamInfoLogin()
{
string aa = "";
string bb = ""; string roomName = Request.Form["RoomName"];
if (roomName == "")
{
aa = "";
} 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、使用反射选取调用方法

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

反射过程中使用的常量:

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

重写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 + ).Split('/');
if (nameList.Length < )
{
Response.End();
return;
} try
{
Assembly assembly = Assembly.Load(ASSEMBLY_NAME);
Type type = assembly.GetType(CLASS_NAME);
MethodInfo method = type.GetMethod(nameList[], System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
method.Invoke(this, null);
}
catch (Exception ex)
{
Response.End();
return;
}
}
}

在Page_Load方法中添加:

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

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

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

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

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"}

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

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, , 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"}

、、

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

4、总结

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

附加:

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

public void UploadImage(string imgPath)
{
var postUrl = string.Empty; HttpWebRequest request = WebRequest.Create(postUrl) as HttpWebRequest;
request.AllowAutoRedirect = true;
request.Method = "POST"; string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n"); int pos = imgPath.LastIndexOf("\\");
string fileName = imgPath.Substring(pos + ); //请求头部信息
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));
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString()); FileStream fs = new FileStream(imgPath, FileMode.Open, FileAccess.Read);
byte[] bArr = new byte[fs.Length];
fs.Read(bArr, , bArr.Length);
fs.Close(); Stream postStream = request.GetRequestStream();
postStream.Write(itemBoundaryBytes, , itemBoundaryBytes.Length);
postStream.Write(postHeaderBytes, , postHeaderBytes.Length);
postStream.Write(bArr, , bArr.Length);
postStream.Write(endBoundaryBytes, , endBoundaryBytes.Length);
postStream.Close(); WebResponse 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);
}

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. lucene 使用注意

    1.建立索引时,忘记writer.close(); 结果: 正常结果:

  2. win7(32/64)+apache2.4+php5.5+mysql5.6 环境搭建配置

        引用自:http://blog.csdn.net/z_cf1985/article/details/22454749 环境:win7 32.(64位的同理,下载相关软件必须是对应的64位版本) ...

  3. 【液晶模块系列基础视频】5.2.X-GUI字体驱动2

    ============================= 技术论坛:http://www.eeschool.org 博客地址:http://xiaomagee.cnblogs.com 官方网店:ht ...

  4. 移动WEB 性能优化方案

    最近一项 研究表明,80%的网民对移动端的浏览体验感到失望,同时,当体验提升时,他们会在智能手机上花费更多的时间. 这不奇怪,因为64%的智能手机用户希望网站可以在4秒内加载完毕,但一半的网站花费了二 ...

  5. Web 在线文件管理器学习笔记与总结(7)重命名文件

    rename($oldname,$newname) 重命名文件或目录 <<<EOF EOF; 使用heredoc 技术,来部分实现界面与代码的准分离 重命名时,需要验证新文件名的合法 ...

  6. 【翻译】CEDEC2014[跨越我的尸体2]跨越Stylized Rendering

    Stylized Rendering相关的一篇PPT,PSV上的[跨越我的尸体2],本代的画风参照的是川瀬巴水的木版画风格.不过因为PSV硬件的限制,最后真机上的效果还是有不少折扣的.ppt里提到参考 ...

  7. 20145235 《Java程序设计》第5周学习总结

    教材学习内容总结 8.1语法与继承架构 try和catch语法,如果被try{}的语句出现了catch()的问题就执行catch{}的语句. 错误的对象都继承于java.long.Throwable, ...

  8. Solr定时更新

    今天用到solr定时重建索引和增量更新技术,就从网上搜了一些资料,在这里给大家整理了一下,也经过了自己的测试,没有异常. Solr官方提供了很强大的Data Import Request Handle ...

  9. linux 自动登录脚本

    #!/usr/bin/expect set port 22 set user xiaoming set password xiaoming123 set host 111.222.22.33 set ...

  10. 大话数据结构(十一)java程序——串

    1.串的定义 串(String):是由零个或多个字符组成的有限序列,又名为字符串. 一般记为s="a1a2a3.........an"(n>=0),其中,s是串名称,用双引号 ...