[转]WinForm如何调用Web Service
1、建立项目WebService和WinForm项目,这里起名为WinFormInvokeWebService,如图所示,
2、Service1.asmx代码为:(这部分其实和上篇的代码是一样的)
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Services;
- using System.Data;
- namespace WebService1
- {
- /// <summary>
- /// Service1 的摘要说明
- /// </summary>
- [WebService(Namespace = "http://tempuri.org/")]
- [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
- [System.ComponentModel.ToolboxItem(false)]
- // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
- [System.Web.Script.Services.ScriptService]
- public class Service1 : System.Web.Services.WebService
- {
- //无参方法
- [WebMethod]
- public string HelloWorld()
- {
- return "Hello World";
- }
- //有参方法1
- [WebMethod]
- public int Add(int a, int b)
- {
- return a + b;
- }
- //有参方法2
- [WebMethod]
- public int Sum(int x)
- {
- int sum = ;
- for (int i = ; i <= x; i++)
- {
- sum += i;
- }
- return sum;
- }
- // 返回一个复合类型
- [WebMethod]
- public Student GetStudentByStuNo(string stuNo)
- {
- if(stuNo=="")
- return new Student { StuNo = "", StuName = "张三" };
- if(stuNo=="")
- return new Student { StuNo = "", StuName = "李四" };
- return null;
- }
- //返回返回泛型集合的
- [WebMethod]
- public List<Student> GetList()
- {
- List<Student> list = new List<Student>();
- list.Add(new Student() { StuNo = "", StuName = "张三" });
- list.Add(new Student() { StuNo = "", StuName = "李四" });
- list.Add(new Student() { StuNo = "", StuName = "王五" });
- return list;
- }
- //返回DataSet
- [WebMethod]
- public DataSet GetDataSet()
- {
- DataSet ds = new DataSet();
- DataTable dt = new DataTable();
- dt.Columns.Add("StuNo", Type.GetType("System.String"));
- dt.Columns.Add("StuName", Type.GetType("System.String"));
- DataRow dr = dt.NewRow();
- dr["StuNo"] = ""; dr["StuName"] = "张三";
- dt.Rows.Add(dr);
- dr = dt.NewRow();
- dr["StuNo"] = ""; dr["StuName"] = "李四";
- dt.Rows.Add(dr);
- ds.Tables.Add(dt);
- return ds;
- }
- }
- public class Student
- {
- public string StuNo { get; set; }
- public string StuName { get; set; }
- }
- }
3、在WebService的web.config文件的system.web节下面加上以下配置。如果不添加在运行手工发送HTTP请求调用WebService(利用GET方式)时,总是出现“远程服务器返回错误: (500) 内部服务器错误。”就是这个该死的错误,让我浪费2个多小时
- <webServices>
- <protocols>
- <add name="HttpPost" />
- <add name="HttpGet" />
- </protocols>
- </webServices>
4、在WinForm应用程序里添加Web引用,有人会发现选择WinForm项目里只能添加服务引用,我当初也是这么认为后来,后来发现在做异步的调用的时候有些方法实在点不出来,所以这里说下如何添加Web引用,选择项目WinFormInvokeWebService右键->添加服务引用,弹出以下对话框
(1)选择高级
(2)选择添加web引用
(3)选择“此解决方案中的Web服务”
(4)选择Service1
(5)在web引用名里输入一个服务名称,这里使用默认的名称localhost,点添加引用
5、添加3个Windows窗体,
(1)Form1拖放的控件为:
Form1的代码为:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- namespace WinFormInvokeWebService
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- localhost.Service1 service = new localhost.Service1();
- localhost.Student s = service.GetStudentByStuNo("");
- MessageBox.Show("学号:" + s.StuNo + ",姓名:" + s.StuName);
- }
- private void button2_Click(object sender, EventArgs e)
- {
- new Form2().Show();
- }
- private void button3_Click(object sender, EventArgs e)
- {
- new Form3().Show();
- }
- }
- }
(2)Form2拖放的控件为:
Form2的代码为:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- //导入此命名空间
- using System.Net;
- using System.Xml;
- using System.IO;
- using System.Web; //先添加System.Web引用再导入此命名空间
- namespace WinFormInvokeWebService
- {
- public partial class Form2 : Form
- {
- public Form2()
- {
- InitializeComponent();
- }
- //手工发送HTTP请求调用WebService-GET方式
- private void button1_Click(object sender, EventArgs e)
- {
- //http://localhost:3152注意你的地址可能和我的不一样,运行WebService看下你的端口改下
- string strURL = "http://localhost:3152/Service1.asmx/GetStudentByStuNo?stuNo=";
- strURL += this.textBox1.Text;
- //创建一个HTTP请求
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL);
- //request.Method="get";
- HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
- Stream s = response.GetResponseStream();
- XmlTextReader Reader = new XmlTextReader(s);
- Reader.MoveToContent();
- string strValue = Reader.ReadInnerXml();
- strValue = strValue.Replace("<", "<");
- strValue = strValue.Replace(">", ">");
- MessageBox.Show(strValue);
- Reader.Close();
- }
- //手工发送HTTP请求调用WebService-POST方式
- private void button2_Click(object sender, EventArgs e)
- {
- //http://localhost:3152注意你的地址可能和我的不一样,运行WebService看下你的端口改下
- string strURL = "http://localhost:3152/Service1.asmx/GetStudentByStuNo";
- //创建一个HTTP请求
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL);
- //Post请求方式
- request.Method = "POST";
- //内容类型
- request.ContentType = "application/x-www-form-urlencoded";
- //参数经过URL编码
- string paraUrlCoded = HttpUtility.UrlEncode("stuNo");
- paraUrlCoded += "=" + HttpUtility.UrlEncode(this.textBox1.Text);
- byte[] payload;
- //将URL编码后的字符串转化为字节
- payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
- //设置请求的ContentLength
- request.ContentLength = payload.Length;
- //获得请求流
- Stream writer = request.GetRequestStream();
- //将请求参数写入流
- writer.Write(payload, , payload.Length);
- //关闭请求流
- writer.Close();
- //获得响应流
- HttpWebResponse response = (HttpWebResponse)request.GetResponse();
- Stream s = response.GetResponseStream();
- XmlTextReader Reader = new XmlTextReader(s);
- Reader.MoveToContent();
- string strValue = Reader.ReadInnerXml();
- strValue = strValue.Replace("<", "<");
- strValue = strValue.Replace(">", ">");
- MessageBox.Show(strValue);
- Reader.Close();
- }
- }
- }
(3)Form3拖放的控件为:
Form3的代码为:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- namespace WinFormInvokeWebService
- {
- public partial class Form3 : Form
- {
- public Form3()
- {
- InitializeComponent();
- }
- //利用Backgroundworker对象
- private void button1_Click(object sender, EventArgs e)
- {
- BackgroundWorker backgroundworker = new BackgroundWorker();
- // 注册具体异步处理的方法
- backgroundworker.DoWork += new DoWorkEventHandler(back_DoWork);
- // 注册调用完成后的回调方法
- backgroundworker.RunWorkerCompleted += newRunWorkerCompletedEventHandler(back_RunWorkerCompleted);
- // 这里开始异步调用
- backgroundworker.RunWorkerAsync();
- //调用服务的同时客户端处理并不停止
- ChangeProcessBar();
- }
- //完成事件
- void back_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
- {
- if (e.Error != null)
- throw e.Error;
- progressBar1.Value = progressBar1.Maximum; //调用完成了,把客户端进度条填充满
- localhost.Student s = e.Result as localhost.Student; //获取处理结果
- MessageBox.Show("学号:" + s.StuNo + ",姓名:" + s.StuName); //显示从服务器获取的结果值
- }
- //调用方法
- void back_DoWork(object sender, DoWorkEventArgs e)
- {
- // Web Service代理类
- localhost.Service1 service = new localhost.Service1();
- // 调用Web方法GetClass1,结果赋值给DoWorkEventArgs的Result对象
- e.Result = service.GetStudentByStuNo("");
- }
- /// <summary>
- /// 界面的进度条显示
- /// </summary>
- void ChangeProcessBar()
- {
- for (int i = ; i < ; i++)
- {
- progressBar1.Value = i;
- System.Threading.Thread.Sleep();
- }
- }
- //调用WebMethod的Async方法
- private void button2_Click(object sender, EventArgs e)
- {
- // Web Service代理类
- localhost.Service1 service = new localhost.Service1();
- //这里开始异步调用
- //service.GetProductPriceAsync("001");
- service.GetStudentByStuNoAsync("");
- // 注册调用完成后的回调方法
- service.GetStudentByStuNoCompleted += newlocalhost.GetStudentByStuNoCompletedEventHandler(GetStudentByStuNoCompleted);
- //调用同时客户端处理不停止
- ChangeProcessBar();
- }
- //完成事件
- void GetStudentByStuNoCompleted(object sender, localhost.GetStudentByStuNoCompletedEventArgs e)
- {
- if (e.Error != null)
- throw e.Error;
- progressBar1.Value = progressBar1.Maximum; //调用完成了,把客户端进度条填充满
- localhost.Student s = e.Result as localhost.Student; //获取处理结果
- MessageBox.Show("学号:" + s.StuNo + ",姓名:" + s.StuName); //显示从服务器获取的结果值
- }
- }
- }
运行结果:
[转]WinForm如何调用Web Service的更多相关文章
- C#之VS2010ASP.NET页面调用Web Service和winform程序调用Web Service
一:用ASP.NET调用Web Service 打开VS2010,打开“文件-新建-网站”,选择“ASP.NET网站” 选好存储位置,语言后点击确定,进入默认页面.然后先添加Web引用,把WebSer ...
- WinForm如何调用Web Service
参考地址 今天看了李天平关于WinForm调用Web Service的代码,我自己模仿做一个代码基本都是复制粘贴的,结果不好使.郁闷的是,又碰到那个该死的GET调用Web Service,我想肯定又是 ...
- ORACLE存储过程调用Web Service
1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...
- C#开发和调用Web Service
http://blog.csdn.net/h0322/article/details/4776819 1.1.Web Service基本概念 Web Service也叫XML Web Service ...
- php5调用web service
工作中需要用php调用web service接口,对php不熟,上网搜搜,发现关于用php调用web service的文章也不多,不少还是php4里用nusoap这个模块调用的方法,其实php5里已经 ...
- 通过ksoap2-android来调用Web Service操作的实例
import java.io.IOException; import org.ksoap2.SoapEnvelope;import org.ksoap2.serialization.SoapObjec ...
- 使用Android应用调用Web Service
Java本身提供了丰富的Web Service支持,比如Sun公司指定的JAX-WS 2规范,还有Apache开源组织所提供的Axis1.Axis2.CXF等,这些技术不仅可以用于非常方便地对外提 ...
- Dynamic CRM 2013学习笔记(二十五)JS调用web service 实现多条记录复制(克隆)功能
前面介绍过如何克隆一条当前的记录: Dynamic CRM 2013学习笔记(十四)复制/克隆记录 , 主要是通过界面上加一个字段,单击form上的clone 按钮时,改变这个字段的值以触发插件来实现 ...
- ASP.NET调用Web Service
1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...
随机推荐
- RX学习笔记:Bootstrap
Bootstrap https://getbootstrap.com 2016-07-01 在学习FreeCodeCamp课程中了解到Bootstrap,并于课程第一个实战题卡在响应式部分,于是先对B ...
- JS判断上传图片格式是否正确
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Intellij IDEA 14的注册码
IntelliJ IDEA 14 注册码 IntelliJ IDEA 14 下载地址: IntelliJ IDEA 14 下载 分享几个license: (1) key:IDEA value:6115 ...
- 寻找序列中最小的第N个元素(partition函数实现)
Partition为分割算法,用于将一个序列a[n]分为三部分:a[n]中大于某一元素x的部分,等于x的部分和小于x的部分. Partition程序如下: long Partition (long a ...
- Nginx+uWSIG+Django+websocket的实现
1.Django+websocket django-websocket dwebsocket django-websocket是旧版的,现在已经没有人维护,dwebsocket是新版的,推荐使用dwe ...
- Linux_Struct file()结构体
struct file结构体定义在/linux/include/linux/fs.h(Linux 2.6.11内核)中,其原型是:struct file { /* * f ...
- linux之vim编辑器
Vi简介1. Vi是一种广泛存在于各种UNIX和Linux系统中的文本编辑程序.2. Vi不是排版程序,只是一个纯粹的文本编辑程序.3. Vi是全屏幕文本编辑器,它没有菜单,只有命令.4. Vi不是基 ...
- HBase性能优化方法总结(转)
本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,这里涉及的不多,这部分可以参考:淘宝Ken Wu同学的博客. 1. 表的设计 1.1 Pr ...
- POJ1269+直线相交
求相交点 /* 线段相交模板:判相交.求交点 */ #include<stdio.h> #include<string.h> #include<stdlib.h> ...
- android TabActivity的局限性 是否还有存在的必要性
TabActivity的局限性 是否还有存在的必要性 其实谷歌有此举动,我们也应该早就想到了,为什么会这么说呢?那就要从TabActivity的原理开始说起了. 做个假定先: 比如我们最外面的Act ...