WinForm如何调用Web Service-阿里云开发者社区

开发者社区> awbeci> 正文

WinForm如何调用Web Service

简介: 参考地址 今天看了李天平关于WinForm调用Web Service的代码,我自己模仿做一个代码基本都是复制粘贴的,结果不好使。郁闷的是,又碰到那个该死的GET调用Web Service,我想肯定又是Web.config需要配置,结果WinForm没有这个配置文件,奇怪,为什么人家的就好使,我写的就不好使呢。
+关注继续查看

参考地址

今天看了李天平关于WinForm调用Web Service的代码,我自己模仿做一个代码基本都是复制粘贴的,结果不好使。郁闷的是,又碰到那个该死的GET调用Web Service,我想肯定又是Web.config需要配置,结果WinForm没有这个配置文件,奇怪,为什么人家的就好使,我写的就不好使呢。

上网搜吧,唉,找个两个多小时,基本都是和我一样的代码,互相转载。根本没人提代码好不好使,也没人提正确的用法。就在我要放弃的时候,终于发现原来是在 Web Service的Web.config里配置的(下面滴2步),真是欲哭无泪啊,大家可要注意啊。

好了,把过程详细说下吧。

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 = 0;

            for (int i = 0; i <= x; i++)

            {

                sum += i;

            }

            return sum;

        }

 

        // 返回一个复合类型

        [WebMethod]

        public  Student GetStudentByStuNo(string stuNo)

        {

            if(stuNo=="001")

                return new Student { StuNo = "001", StuName = "张三" };

            if(stuNo=="002")

                return new Student { StuNo = "002", StuName = "李四" };

            return null;

        }

 

        //返回返回泛型集合的

        [WebMethod]

        public List<Student> GetList()

        {

            List<Student> list = new List<Student>();

 

            list.Add(new Student() { StuNo = "001", StuName = "张三" });

            list.Add(new Student() { StuNo = "002", StuName = "李四" });

            list.Add(new Student() { StuNo = "003", 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"] = "001"; dr["StuName"] = "张三";

            dt.Rows.Add(dr);

 

            dr = dt.NewRow();

            dr["StuNo"] = "002"; 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("002");

            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, 0, 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 aslocalhost.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("002");

        }

 

        /// <summary>

        /// 界面的进度条显示

        /// </summary>

        void ChangeProcessBar()

        {

            for (int i = 0; i < 10; i++)

            {

                progressBar1.Value = i;

                System.Threading.Thread.Sleep(500);

            }

        }

 

        //调用WebMethod的Async方法

        private void button2_Click(object sender, EventArgs e)

        {

            // Web Service代理类

            localhost.Service1 service = new localhost.Service1();

 

            //这里开始异步调用

            //service.GetProductPriceAsync("001");

            service.GetStudentByStuNoAsync("002");

 

            // 注册调用完成后的回调方法

            service.GetStudentByStuNoCompleted += newlocalhost.GetStudentByStuNoCompletedEventHandler(GetStudentByStuNoCompleted);

 

            //调用同时客户端处理不停止

            ChangeProcessBar();

        }

        //完成事件

        void GetStudentByStuNoCompleted(object sender, localhost.GetStudentByStuNoCompletedEventArgse)

        {

            if (e.Error != null)

                throw e.Error;

            progressBar1.Value = progressBar1.Maximum;                              //调用完成了,把客户端进度条填充满

            localhost.Student s = e.Result aslocalhost.Student;                    //获取处理结果

            MessageBox.Show("学号:" + s.StuNo + ",姓名:" + s.StuName);            //显示从服务器获取的结果值

        }

 

 

    }

}

 运行结果:

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
c#中跨线程调用windows窗体控件
c#中如何跨线程调用windows窗体控件? 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。首先来看传统方法: public partial class Form1 : Form...
1032 0
WinForm如何调用Web Service
参考地址 今天看了李天平关于WinForm调用Web Service的代码,我自己模仿做一个代码基本都是复制粘贴的,结果不好使。郁闷的是,又碰到那个该死的GET调用Web Service,我想肯定又是Web.config需要配置,结果WinForm没有这个配置文件,奇怪,为什么人家的就好使,我写的就不好使呢。
747 0
c#——web service异构系统调用
public static class WebServiceInvoker { /// /// 动态调用WebService /// /// WebService地址 /// 方法名(...
1005 0
Asp.Net Web API 2第三课——.NET客户端调用Web API
原文:Asp.Net Web API 2第三课——.NET客户端调用Web API Asp.Net Web API 导航     Asp.Net Web API第一课——入门http://www.cnblogs.com/aehyok/p/3432158.html       Asp.Net Web API第二课——CRUD操作http://www.cnblogs.com/aehyok/p/3434578.html 前言 本教程演示从一个控制台应用程序,使用HttpClient调用Web API。
1097 0
关于my.getAuthUserInfo报错:error4,无权跨域调用 的解决方案
使用my.getAuthUserInfo之前,是需要先使用my.getAuthCode的,两个API可以嵌套使用: my.getAuthCode({ scopes: 'auth_user', success: (res) => { my.
1653 0
gdy
C#调用vbs脚本实现Windows版Siri
  最近新加入,把自己一些有意思的小东西分享给大家,我是一个学生,代码写得少,哪里不规范,希望大家见谅。   这事我封装好的一个类,可以直接实例化对象之后,调用"对象.Talk()"方法,让机器读出你传递进去的字符串。
903 0
动态调用WebService
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.
678 0
+关注
awbeci
我的名字叫张威(多好听的名字啊),毕业于哈弗大学(之前和比尔&middot;盖次是同学,自从那家伙创立了威软,我和他的关系就不太好,我发誓要打败他,然后进入安徽机电职业技术学院学习软件技术,你们觉得我会成功么), 现在在一家世界五百强公司任职UFO(想问我是什么公司?叫合肥优尔电子科技有限公司
590
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载