zoukankan      html  css  js  c++  java
  • Winform项目调用asp.net数据接口

      最近一个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 = "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、使用反射选取调用方法

    假设在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 + 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方法中添加:

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

    、、

    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, 0, 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("
    --" + boundary + "
    ");
                byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("
    --" + boundary + "--
    ");
    
                int pos = imgPath.LastIndexOf("\");
                string fileName = imgPath.Substring(pos + 1);
    
                //请求头部信息 
                StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name="file";filename="{0}"
    Content-Type:application/octet-stream
    
    ", 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, 0, bArr.Length);
                fs.Close();
    
                Stream postStream = request.GetRequestStream();
                postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
                postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
                postStream.Write(bArr, 0, bArr.Length);
                postStream.Write(endBoundaryBytes, 0, 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、

  • 相关阅读:
    指针变量的值和指针变量地址
    定时备份docker容器中mysql的数据
    sql server表外键查询
    Go语言strings包基本操作
    centos安装字体库处理中文乱码
    codeforces 1610D
    汽车配件生产加工企业管理软件出售生产加工刹车盘、刹车鼓、刹车蹄、刹车片等企业通用
    关于document.onmousemove报错Invalid or unexpected token问题
    SilverLight支持的DataTable可以直接绑定
    我的工作我的状态
  • 原文地址:https://www.cnblogs.com/ysyn/p/4022087.html
Copyright © 2011-2022 走看看