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




    C/S系统也可以和B/S系统一样实现“前后端分离”,那这样写winform就相当于纯粹的前端页面了,然后再单独部署一个webapi项目,通过api调用数据库进行数据的操作,有利于维护和数据安全性的提高,那么winform怎么去调用api接口呢,写了一个demo,大家借鉴一下哈,本人才疏学浅,有不足和错误请指出:

            winform界面就不设计了,仅仅是为了测试是否调用到api,直接在创建的类库中写一个方法:

    [csharp] view plain copy
    1.        /// <summary>  
    2.        /// 调用api返回json  
    3.        /// </summary>  
    4.        /// <param name="url">api地址</param>  
    5.        /// <param name="jsonstr">接收参数</param>  
    6.        /// <param name="type">类型</param>  
    7.        /// <returns></returns>  
    8.        public static string HttpApi(string url, string jsonstr, string type)  
    9.        {  
    10.            Encoding encoding = Encoding.UTF8;  
    11.            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);//webrequest请求api地址  
    12.            request.Accept = "text/html,application/xhtml+xml,*/*";  
    13.            request.ContentType = "application/json";  
    14.            request.Method = type.ToUpper().ToString();//get或者post  
    15.            byte[] buffer = encoding.GetBytes(jsonstr);  
    16.            request.ContentLength = buffer.Length;  
    17.            request.GetRequestStream().Write(buffer, 0, buffer.Length);  
    18.            HttpWebResponse response = (HttpWebResponse)request.GetResponse();  
    19.            using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))  
    20.            {  
    21.                return reader.ReadToEnd();  
    22.            }  
    23.        }  

    然后再winform界面的事件中调用该方法:

    [csharp] view plain copy
    1. private void button3_Click(object sender, EventArgs e)  
    2.         {  
    3.             string url = "...(此处为api端口)/api/VisitorInfo/GetEndVisitorInfoList";  
    4.             var str = ApiHelper.HttpApi(url, "{}""get");  
    5.         }  

    本地运行后变量str接收数据格式如下:


    HttpWebRequest请求时无法发送具有此谓词类型的内容正文。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(postUrl); //--需要封装的参数
                request.CookieContainer = new CookieContainer();
                CookieContainer cookie = request.CookieContainer;//如果用不到Cookie,删去即可 
                //以下是发送的http头
                request.Referer = "";
                request.Accept = "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                request.Headers["Accept-Language"] = "zh-CN,zh;q=0.";
                request.Headers["Accept-Charset"] = "GBK,utf-8;q=0.7,*;q=0.3";
                request.UserAgent = "User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1";
                request.KeepAlive = true;
                //上面的http头看情况而定,但是下面俩必须加 
                request.ContentType = "application/x-www-form-urlencoded";
                Encoding encoding = Encoding.UTF8;//根据网站的编码自定义
                request.Method ="get"//--需要将get改为post才可行
                string postDataStr;
                Stream requestStream = request.GetRequestStream();
                if (postDatas != "")
                {
                    postDataStr=postDatas;//--需要封装,形式如“arg=arg1&arg2=arg2”
                    byte[] postData = encoding.GetBytes(postDataStr);//postDataStr即为发送的数据,
                    request.ContentLength = postData.Length;
                    requestStream.Write(postData, 0, postData.Length);
                }
     
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream responseStream = response.GetResponseStream();
     
     
                StreamReader streamReader = new StreamReader(responseStream, encoding);
                string retString = streamReader.ReadToEnd();
     
                streamReader.Close();
                responseStream.Close();
                return retString;

      如果是以流的方式提交表单数据的时候不能使用get方法,必须用post方法,

     

    改为

    1
    request.Method ="post";  就可以了。  做一个记号


    今天请求接口直接调了以前写好的方法,结果报了(405)不支持方法的错误,一看是GET写成POST了,改成GET之后,又报了无法发送具有此谓词类型的内容正文错误的错误

    原来之前的方法里面有GetRequestStream(), GET请求并不支持它。

    把GetRequestStream()和相应的代码注释掉就OK了

          // Stream outStream = myRequest.GetRequestStream();
          // outStream.Write(arrB, 0, arrB.Length);
          //outStream.Close();

    特此记录!

    展开全文
  • winform宿主webapi

    千次阅读 2019-05-16 20:19:07
    引用的Dll 添加配置文件packages.config <?xml version="1.0" encoding="utf-8"?...package id="Microsoft.AspNet.WebApi.Client" version="5.2.6" targetFramework="net461" /> <p...

    引用的Dll

    添加配置文件packages.config

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="Microsoft.AspNet.WebApi.Client" version="5.2.6" targetFramework="net461" />
      <package id="Microsoft.AspNet.WebApi.Core" version="5.2.6" targetFramework="net461" />
      <package id="Microsoft.AspNet.WebApi.SelfHost" version="5.2.6" targetFramework="net461" />
      <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net461" />
    </packages>

    新建Controller文件夹里面的ValuesConntroller.cs类

     [RoutePrefix("api/values")]
        public class ValuesController : ApiController
        {
            [HttpGet]
            [Route("st")]
            public string GetServerTim(string id)
            {
                try
                {
                    string result = Program.FormCheck.GetJsonById(id);
    
                    return result;
                }
                catch
                {
                    return "failed :"+ id;
                }
            }
            protected HttpRequestBase GetRequest()
            {
                HttpContextBase context = (HttpContextBase)Request.Properties["MS_RequestContext"];//获取传统context
    
                HttpRequestBase request = context.Request;//定义传统request对象
    
                return request;
            }
            private string GetClientIp(HttpRequestMessage request = null)
            {
                request = request ?? Request;
    
                if (request.Properties.ContainsKey("MS_HttpContext"))
                {
                    return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
                }
                else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
                {
                    RemoteEndpointMessageProperty prop = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name];
                    return string.Format("Address:{0}, Port: {1}", prop.Address, prop.Port.ToString());
                }
                else if (HttpContext.Current != null)
                {
                    return HttpContext.Current.Request.UserHostAddress;
                }
                else
                {
                    return null;
                }
            }
        }

    Program类中这样写

     public static class Program
        {
            public static CheckInterface FormCheck = null;
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                FormCheck = new CheckInterface();
                Application.Run(FormCheck);
            }
        }

    Form中这样写

      HttpSelfHostConfiguration config = null;
            HttpSelfHostServer server = null;
          
            public CheckInterface()
            {
                InitializeComponent();
                renderDgv_Interface.AllowUserToAddRows = false;
            }
    
            private void CheckInterface_Load(object sender, EventArgs e)
            {
                RefreshWebApi();
            }
            private void RefreshWebApi()
            {
                config = new HttpSelfHostConfiguration(Url);// "http://192.168.0.163:8085");
                config.Routes.MapHttpRoute("API Default", "api/{controller}/{id}", new { id = RouteParameter.Optional });
                server = new HttpSelfHostServer(config);
                server.OpenAsync().Wait();
            }

    启动之后浏览器访问http://192.168.0.163:8085/api/values?id=001即可看到weiapi接口已经成功在Winform上运行。

    如果想要访问Webapi执行方法与WinformUI界面交互,用委托另外还要判断几个属性

     

      delegate void DAddRdgvData(List<JsonData> DataSourse);
    
            private void AddRdgvData(List<JsonData> DataSourse)
            {
                if (renderDgv_Interface.InvokeRequired)
                {
                    while (!this.renderDgv_Interface.IsHandleCreated)
                    {
                        if (this.renderDgv_Interface.Disposing || this.renderDgv_Interface.IsDisposed)
                            return;
                    }
                    DAddRdgvData d = new DAddRdgvData(AddRdgvData);
                    this.renderDgv_Interface.Invoke(d, new object[] { DataSourse });
                }
                else
                {
    
                    for (int i = 0; i < DataSourse.Count; i++)
                    {
                        if (ListId.Contains(DataSourse[i].Id))
                        {
                            for (int j = 0; j < renderDgv_Interface.RowCount; j++)
                            {
                                if (renderDgv_Interface.Rows[j].Cells["rdgv_Interface_id"].Value != null)
                                {
    
                                    if (DataSourse[i].Id.Equals(renderDgv_Interface.Rows[j].Cells["rdgv_Interface_id"].Value.ToString()))
                                    {
                                        renderDgv_Interface.Rows[j].Cells["rdgv_Name"].Value = DataSourse[i].Name;
                                        renderDgv_Interface.Rows[j].Cells["rdgv_Time"].Value = DataSourse[i].Time;
                                        renderDgv_Interface.Rows[j].Cells["Rdgv_NumberTimes"].Value = DataSourse[i].Numberoftimes;
                                        renderDgv_Interface.Rows[j].Cells["rdgv_Return"].Value = DataSourse[i].CheckResult;
                                    }
    
                                }
                            }
                        }
                        else
                        {
                           //这里向控件传数据
                        }
                    }
                }
            }

    展开全文
  • 一开始用了自带的webbrowser,不支持H5,脚本会有问题,后来又用了webkitBrowser,发现有些js效果还是显示不出来,和webbrowser稍微好一点,但是还是不行,然后决定用CefSharp,用了之后效果完美。...

    一开始用了自带的webbrowser,不支持H5,脚本会有问题,后来又用了webkitBrowser,发现有些js效果还是显示不出来,和webbrowser稍微好一点,但是还是不行,然后决定用CefSharp,用了之后效果完美。

    源码地址:https://download.csdn.net/download/horseroll/10801280

    方法一:通过Nuget程序包引入CefSharp.Winforms(行不通)

    我引入了CefSharp.Winforms后,系统只引用了Microsoft.Sharp这个dll,没有引用其他的dll,后面代码编写引用会出错,所以不推荐此方法

    方法二:直接引入(亲测可用)

    1.创建winform程序,需要注意的是需要使用.NetFrameWork4.5.2以上

    2.在解决方案上右键->"属性"->"生成"->"目标平台",选择x86或x64,Cef暂不支持"Any CPU"。如果平台里没有x86,在生成-配置管理器中的平台进行新建平台,

    需要注意的是如果新建平台,debug目录会生成新建平台的文件夹,注意到时候文件的存放位置

    3.下载并解压CefSharp编译好的文件,注意是32位还是64位。

    4.将下载下来的文件解压,然后全部复制到程序bin\Debug目录。注意文件的存放位置

    5.项目右键"添加引用",添加以下dll:

    CefSharp.dll
    CefSharp.Core.dll

    CefSharp.WinForms.dll

    6.编写测试代码:

    using CefSharp;
    using CefSharp.WinForms;      
     
    public ChromiumWebBrowser browser;
    public void InitBrowser(){
        Cef.Initialize(new CefSettings());
        browser = new ChromiumWebBrowser ("www.baidu.com");
        this.Controls.Add(browser);
        browser.Dock = DockStyle.Fill;
    
    }

    在InitializeComponent()方法中调用 InitBrowser()。

    7.F5调试运行即可。

    8.与js交互

    _browser.GetBrowser().MainFrame.EvaluateScriptAsync("test_val=" + new Random().Next().ToString("F")); //设置页面上js的test_val变量为随机数
    _browser.GetBrowser().MainFrame.EvaluateScriptAsync("testArg('123','我是NET' )");//运行页面上js的testArg带参数的方法
    _browser.GetBrowser().MainFrame.EvaluateScriptAsync("test()");//运行页面上js的test方法

     

     

    展开全文
  • WinForm UI设计与开发思路

    千次阅读 2008-04-18 02:48:00
    最近一年来一直在做WinForm相关的系统,对WinForm的UI设计有一些想法想和大家讨论(主要是比较忙,所以很多只是设想,还没有开发实例) 关于WinUI,理想的情形应该是外观比较cool,能给用户良好的使用体验和印象,...
    近一年来一直在做WinForm相关的系统,对WinForm的UI设计有一些想法想和大家讨论(主要是比较忙,所以很多只是设想,还没有开发实例)
      关于WinUI,理想的情形应该是外观比较cool,能给用户良好的使用体验和印象,同时又兼顾功能强大和容易开发。但基于传统的.NET WindowsForms,恐怕除了容易开发,在其他方面的指标都很普通了。如果为了界面和功能,则复杂度会提高很多,用大量的GDI+和API操作,相信会让很多人头痛不已。
      以下是一些思路:
    Custom Control 写代码定制控件
    Shell Style 利用Shell Style工具
    Flash Control 利用Flash控件
    Html Control 利用Html控件


      编程来实现各种样式的控件,这个是大家比较熟悉和常用的方法,也是上面提到过的。我们现在集中来讲解一下后面三种。

    Windows Shell Style

      不知道大家在厌倦了Windows默认的窗体和菜单后,是不是用过一些改变Windows外观的软件,例如StarDock公司的很多产品(WindowBlinds总知道吧)以及TGTSoft的StyleXP。

    轻松改变Windows程序的外观


      事实上微软在Win2000,XP,2003系统上均引入了Visual Style的概念,也就是系统外观主题。它提供了一些API,可以方便地修改Windows窗体和控件的整体外观呈现。所以我们一般在改变Windows的主题后,一般大部分程序的按钮、形状都会跟着改变(在.NET中可能需要将控件的FlatStyle设成System并且EnableVisualStyles()才会有效)

      这里要提的是TGTSoft的StyleXP工具,它基于Windows Visual Style架构,同时又有自己的API,此外,它还有其他一些优点,比如它的每种外观样式,全部打包在一个DLL文件中,同时还有相应的工具(StyleBuilder)来制作这些样式DLL。
      在安装完StyleXP后,我们可以在"C:/WINDOWS/Resources/Themes/主题名称/shell"目录中找到该主题的DLL文件。

    StyleBuilder让你定制自己的Windows外观


      有了这些基础,我们就可以在我们的程序中利用ShellStyle的API来应用这些外观样式,通过加载不同的资源DLL,就可以轻松改变软件的外观。当然这种方式中,你所使用的控件还是传统的Windows控件,所以还是有一定局限性。
      至于如何利用ShellStyle的API,CodeProject上有一个不错的例子:Themed Windows XP style Explorer Bar

    Flash Control

      我们知道Flash的出现和广泛流行都是由于Web环境,但Flash发展到今天,其功能已不单单局限于Web。我这里提出的一种思路就是把Flash作为控件应用在WinForm中。微软研究院的Wallop就是完全用的Flash。
      我们首先来看一下这种实现的技术前提:
    1 Macromedia提供了Flash Player的ActiveX控件,可以直接嵌入到WinForm
    2 Flash本身提供了和Web环境类似的表单控件(TextBox,Button..)
    3 Flash提供了和外界的数据交换功能,可以通过FSCommand向外发送事件
    4 Flash内部可以使用ActionScript(一种类似JavaScript的脚本)控制其内部行为
    5 Flash对Http和Xml有良好的支持
    6 Flash支持WebService

      如果你以前不了解或熟悉Flash,当你看到这么多激动人心的特性后,大脑里已经迸发出各种思想的火花了?Flash不仅可以帮助我们在WinForm里实现各种强大的交互功能,而且可以借助于WebService,实现类似于SmartClient的富客户端(SmartClient既不算胖也不算瘦客户端吧)^^
      我们再来看一下除了以上几点,Flash真正吸引我们解决文章前面提到的问题的一些特性:
    1 Flash基于流传输,非常小巧并且嵌入浏览器
    2 纯Flash可以做到跨平台
    3 Flash在动画效果和用户交互上的强大表现力
    4 Flash动态交互效果的容易实现(相对于WinForm编程来说)

    FLASH外观


    HTML Control

      既然可以在应用程序中使用Flash,那么在其中使用HTML页面呢?当然可以,事实上这并不是一种新做法,比如微软,就在相当长时间里都在它的软件里广泛使用这种技术,例如MSN。在应用程序中嵌套HTML,好处自然就是可以把Application做得像Web一样,一个网页的外观可以做到哪种程度,你的控件,窗体也可以做到哪种程度。我们在一个网页上用HTML代码、Table表格、Form表单,各种图片以及CSS搞出来的漂亮界面,在WinForm中靠代码达到相同效果可是很大的工程。而对这些界面的调整,在html里也许很方便的改一下图片和css,在WinForm中可能相当于重写控件。以上这些都是促使我们使用Flash Control或者Html Control的重要原因:开发、修改其内容和外观样式都很方便。

      在WinForm中嵌套HTML,就目前来说我们只能用COM组件WebBrowser,在.NET里用起来不是很方便。
      关键问题在于,我们这里讨论的WebBrowser和HTML Control是作为软件系统的控件或其一部分,而并不是单纯的浏览器作用。也就是说,我们首先在乎的是其界面,然后是其交互性,也就是这些HTML Control的容器要能够访问和控制这些HTML的内容和行为。
      在WinForm里取得Html里的控件属性是比较容易的,但你有没有想过嵌套在你的WinForm里的HTML,仍能够访问WinForm里的对象呢?看看LostINet的这篇文章:
      结合 MSHTML 与 WebBrowser 生成美观实用的 WinForm 应用程序。

      由于WebBrowser通过Navigate()方法来访问某个指定的HTML页面,所以这个页面的位置无非以下几种情况:
      1, 远程Web服务器,例如 http://www.tempuri.org/somepage.htm 或者 http://www.tempuri.org/somepage.aspx
      2. 本地Web服务器,例如 http://localhost/somepage.htm 或者 http://localhost/somepage.aspx
      3. 本地文件系统,例如 D:/mysoft/welcome.htm (只能是静态页面了)

      这样的一个问题就是,当你发布你的软件时,这些HTML需要一起发布,而且是完全暴露在用户面前。有没有办法把HTML一起打包呢?



      WebBrowser需要浏览一个url,这没错,但这个Web服务器能不能在我们的软件启动时,被虚拟创建出来呢?其实我们可以使用
      System.Web.Hosting.ApplicationHost.CreateApplicationHost()方法创建我们自己的Web宿主环境。
      它其实是把一个本地目录作为根虚拟目录,然后在内存里开辟一个新的ApplicationDomain来充当Web宿主。在这个AppDomain里我们又可以通过 HttpRuntime.ProcessRequest(new SimpleWorkerRequest(page, query, writer)) 来处理某个请求。而这个Web宿主环境还既可以运行静态HTML,也可以运行ASP.NET 也就是说我们可以用ASP.NET来开发我们的WinForm控件,而我们的软件内嵌了一个小型的ASP.NET服务器。
    在这里我们可以把所有的页面都作为资源嵌入到你的软件里,然后在运行的时候自动把它们都释放到一个临时目录,然后让WebBrowser直接访问这个目录,或者启动你的Web宿主,访问它提供的虚拟路径。

      有没有更好的办法呢?我想就是自己写一个复杂的Web宿主,能够直接从资源文件中读取HTML,而不是通过虚拟目录。这样的话我们就可以把所有用到的页面,甚至整个网站打包到一个DLL了
     
    展开全文
  • 基于百度地图APIWinForm地图

    万次阅读 2013-07-08 14:13:28
    大概去年的这个时候,我用VB写了一个百度地图的Demo,使用了webBrowser加载本地网页的方式,只是限于当时的技术,好多... 答:地图调用了百度地图API(http://developer.baidu.com/map/),由于百度地图API是基于javasc
  • [C#]winform使用html做界面

    万次阅读 2012-01-05 17:27:39
    DirectUI技术开发界面的好奇 今天...光说不练是假打,所以花了一个把小时尝试把winform的界面做成 webui 一:  大家都知道 winform 中有个控件叫 webBrowser 如果你不知道具体怎么用 详细看msdn 都知道了; 这
  • WPF四年,尤不足以替代WinForm

    千次阅读 2010-05-09 19:43:00
    WPF四年,尤不足以替代WinFormWPF出山已四年,作为官方内定的下一代UI系统掌门,没少露脸。但这个新掌门能否胜任,仍是众多开发者的心头之虑。通过对VisualStudio 2010的编辑器部分用WPF重写,微软终于对这个胜任...
  • 往往的,业务中存在很多不同系统之间的访问,这时候需要跨语言(跨系统)进行数据库交互。 这里的例子是C# 客户端访问JAVA 接口,获取Json 数据。 首先部署了一个可以访问的接口,通过这个URL 可以正常的访问到...
  • 近期开发winform桌面应用时,需要获取当前的经纬度坐标,并显示在地图上(我们要实现的是arcgis engine的地图,但事实上不论是百度还是googel这些地图,只要获取了当前的经纬度坐标,一切都好说)。我花费了快一天的...
  • web应用程序中,将网页切换到源代码并把源代码中一些没用的代码删掉,只保留头部,在windows应用程序读取网页源码时,这些都会被一起读下来,但这些都是没用的数据,而且删掉没什么影响。需要保留的代码如下: ­...
  • 在一些小的数据交互过程中,我们可以使用轻量级的webservice来实现数据交互接口.但是在数据量较大,且访问频率较高的情况下.webservice的效率肯定是不能满足要求的. webservice是基于http协议,交互过程中使用xml格式...
  • 工作流中间件-XBPM V2.0 XBPM是一个.NET环境下的工作流中间件。XBPM工作流主要包括工作流引擎服务、服务管理器、流程语言定义工具、企业流程... 同时XBPM为开发人员提供了一套完整的API,方便其他应用程序调用,以
  • 实时 web 功能是让服务器代码将内容推送到连接的客户端立即可用,而不是让服务器等待客户端请求新数据的能力。 SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来...
  • BS工作原理—BS总结

    千次阅读 多人点赞 2014-01-09 10:38:00
    WEB开发技术的认识(HTML、CSS、XML、JS、AJAX、Jquery),对BS浏览器/服务器交互原理的疑问,梳理,ASP.NET的学习总结。
  • 当基于SOA系统开发时,各系统之间独立自治的运行,在开发这些接口时,基本上与同一个系统中类库开发相同,但也必然存在差异,本文将对Web services(web API) 性能优化基本规则作简单的总结
  • Unity3D内部串口通信和Unity3D与WinForm程序间的串口通信。容易引发的错误、异常,以及串口正常工作的区别。解决方法和思路。
  • 主要是开发一个web应用能够让用户上传个人信息,包括姓名、出生年月之类的,其中尤其是需要上传用户的个人照片(照片格式可能要200k左右),然后还要开发一个桌面应用需要与web服务器通信,获取用户上传的数据然后再...
  • 前后端分离实践的架构设计

    万次阅读 2019-01-08 20:25:59
    前后端分离的项目开发策略已经不是什么新鲜东西了,网上介绍这方面的文章非常多。我自己是在14年的时候接触到的,对这种开发策略一直爱不释手,不管新老项目都会首先用前后端分离的思维先去思考一番。...
  • 共有12款C# 报表/图表制作开源软件

    万次阅读 2014-01-29 01:31:56
    【商业】商业图表库 ChartDirector ...ChartDirector 是一款商业的图表库,有多种语言的版本,使用它做的图表非常的精细漂亮,提供免费版本,但会出现logo信息。... 对比我一直使用的JFreeChart来看呢,它的优点...
  • B/S开发框架(asp.net mvc + web api + easyui)

    千次阅读 2013-06-26 18:18:45
    本人非常喜欢这篇文章,特地拿出来分享,希望各位学习 这篇文章写了很多,如果能有耐心看完的话,肯定是受益匪浅,本人曾经也想过程序就应该是三两句代码可以搞定的,因为都是重复性的东西,可是能力有限,力不从心...
1 2 3 4 5 ... 20
收藏数 2,886
精华内容 1,154
关键字:

webapi交互数据winform