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("&lt;", "<");

            strValue = strValue.Replace("&gt;", ">");

            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("&lt;", "<");

            strValue = strValue.Replace("&gt;", ">");

            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的更多相关文章

  1. C#之VS2010ASP.NET页面调用Web Service和winform程序调用Web Service

    一:用ASP.NET调用Web Service 打开VS2010,打开“文件-新建-网站”,选择“ASP.NET网站” 选好存储位置,语言后点击确定,进入默认页面.然后先添加Web引用,把WebSer ...

  2. WinForm如何调用Web Service

    参考地址 今天看了李天平关于WinForm调用Web Service的代码,我自己模仿做一个代码基本都是复制粘贴的,结果不好使.郁闷的是,又碰到那个该死的GET调用Web Service,我想肯定又是 ...

  3. ORACLE存储过程调用Web Service

    1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...

  4. C#开发和调用Web Service

    http://blog.csdn.net/h0322/article/details/4776819 1.1.Web Service基本概念 Web Service也叫XML Web Service ...

  5. php5调用web service

    工作中需要用php调用web service接口,对php不熟,上网搜搜,发现关于用php调用web service的文章也不多,不少还是php4里用nusoap这个模块调用的方法,其实php5里已经 ...

  6. 通过ksoap2-android来调用Web Service操作的实例

    import java.io.IOException; import org.ksoap2.SoapEnvelope;import org.ksoap2.serialization.SoapObjec ...

  7. 使用Android应用调用Web Service

    Java本身提供了丰富的Web  Service支持,比如Sun公司指定的JAX-WS  2规范,还有Apache开源组织所提供的Axis1.Axis2.CXF等,这些技术不仅可以用于非常方便地对外提 ...

  8. Dynamic CRM 2013学习笔记(二十五)JS调用web service 实现多条记录复制(克隆)功能

    前面介绍过如何克隆一条当前的记录: Dynamic CRM 2013学习笔记(十四)复制/克隆记录 , 主要是通过界面上加一个字段,单击form上的clone 按钮时,改变这个字段的值以触发插件来实现 ...

  9. ASP.NET调用Web Service

    1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...

随机推荐

  1. 64位Win8系统下安装Oracle12c

    经过3个小时的折腾,终于在64位win8系统下成功安装了Oracle 12c.这篇文章主要把安装过程中遇到的一些问题总结一下,以便帮助后来人参考. 首先我把我的机器的主要配制情况列举出来: 1. 系统 ...

  2. asp.net+MVC--1

    1.MVC入门 1)第一个路由: /*任何应用程序启动时发生的动作都应该存在于单独的类中,并且仅在该方法中按照正确顺序调用*/        protected void Application_St ...

  3. JavaScript自定义方法实现trim()、Ltrim()、Rtrim()

    去除字符串两端的空格,是字符串处理非常常用的方法如何trim() .Ltrim() .Rtrim(),可惜的是javascript中无此方法,下面有个不错的自定义教程感兴趣的朋友可以参考下 去除字符串 ...

  4. php中 __autoload函数 自动加载类文件机制

    魔术函数,自动加载机制function __autoload($class_name) {   //自动传递的是类名$path = str_replace('_', '/', $class_name) ...

  5. (转载)SQL语句导入导出大全

    SQL语句导入导出大全 /******* 导出到excel EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c ...

  6. Nginx+uWSIG+Django+websocket的实现

    1.Django+websocket django-websocket dwebsocket django-websocket是旧版的,现在已经没有人维护,dwebsocket是新版的,推荐使用dwe ...

  7. 自定义一个"花瓣"菜单-b

    先来看一下效果 XLCircleMenu.gif 是不是觉得挺好玩的呀. 通过这篇文章你可以学到: 1.系统UITableView的部分设计思想 2.自定义控件常用设计思路 3.动画的具体使用 4.手 ...

  8. JavaScript typeof function()的注意事项

    首先,上一段代码: var f = function g() { return 23; }; console.log(typeof g); //输出undefined //console.log(ty ...

  9. 如何使用 Xcode Targets 管理开发和生产版本?

    在开始此教程之前,我们假设你已经完成了应用程序的开发和测试,现在准备提交生产发布.问题是,某些 Web 服务 URLs 指向测试服务器,而 API keys 则为测试环境而配置.在提交应用程序给苹果审 ...

  10. 对CURL的一些研究

    http://www.kuqin.com/article/23candcplusplus/586014.html 前两天看到有人求客户端socket 发HTTP包的代码,受flw版主启发找了一些per ...