WinForm如何调用Web Service

1、建立项目WebService和WinForm项目,这里起名为WinFormInvokeWebService.
如图所示:

2、Service1.asmx代码为:(这部分其实和上篇的代码是一样的) 
 

using System;
using System.Collections.Generic;
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、添加3Windows窗体,
(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.Windows.Forms;

//导入此命名空间
using System.Net;
using System.Xml;
using System.IO;
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.ComponentModel;
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 += new RunWorkerCompletedEventHandler(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("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 += new localhost.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_winform post请求webservice_aspnet2002web的博客-CSDN博客

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Winform 是一种常见的 Windows 桌面应用程序开发平台,而 WebAPI 是一种基于 HTTP 的 Web 服务框架,两者可以很好地结合,实现桌面应用程序向 Web 服务发送请求获取数据的功能。 在 Winform调用 WebAPI 可以使用 .NET 的 HttpWebRequest 或 HttpClient 类,封装 HTTP 请求并发送给 Web 服务。在发送请求之前,需要先确定 WebAPI 的 URL 地址,以及请求所要传递的参数。可以使用 HttpClient 的 PostAsync 或 GetAsync 方法发送请求,接收 Web 服务返回的数据并处理。在接收到 WebAPI 的响应后,可以使用 JSON 序列化工具将数据反序列化为 .NET 对象,方便在 Winform 窗体中进行显示或进一步处理。 为了让 Winform 程序与 WebAPI 通信更加简便和高效,可以使用第三方的 RESTful API 框架,如 RestSharp 或 ServiceStack。这些框架可以帮助 Winform 应用程序快速、方便地与 WebAPI 进行通信,简化了操作流程,在 Winform 程序中使用起来更加便捷。 总之,Winform 调用 WebAPI 是一种常见且实用的开发方式,可以帮助开发人员快速获取 Web 服务数据或执行业务操作,提高应用程序的功能和效率。 ### 回答2: Winform 调用 Web API 是一个常见的操作,可以通过以下步骤实现。 首先,在 Winform 中添加 Web 请求的相关代码。通过 HttpClient 类,我们可以轻松地向 Web API 发送 HTTP 请求。下面是一个示例代码,用于在 Winform调用 Web API 中的一个方法: ``` HttpClient client = new HttpClient(); client.BaseAddress = new Uri("http://localhost:5000/"); HttpResponseMessage response = await client.GetAsync("api/values"); if (response.IsSuccessStatusCode) { string result = await response.Content.ReadAsStringAsync(); textBox1.Text = result; } else { textBox1.Text = "Error"; } ``` 在以上代码中,我们首先创建了一个 HttpClient 实例,并指定其 BaseAddress 属性为 Web API 的地址。然后,我们使用 GetAsync 方法向 Web API 发送请求,并等待响应。如果请求成功,我们将响应内容读取为字符串,并在 Winform 的文本框中显示。 在实际的开发中,我们还需要根据具体的需求和 Web API 的设计,设置请求头、请求参数等相关信息。 总的来说,Winform 调用 Web API 是一种方便、快捷、灵活的方法,可以有效地实现前后端分离,提高应用程序的易用性和可扩展性。 ### 回答3: Winform是一种桌面应用程序,它提供了丰富的用户界面和交互功能。WebAPI则是一种基于HTTP协议的状态无关的服务,它可以用来向任何客户端(包括Winform应用程序)提供数据或者执行某些操作。 要在Winform调用WebAPI,需要使用HttpClient类来发送请求和接收响应。首先需要创建一个HttpClient实例,通过它可以发起各种类型的HTTP请求(如GET、POST、PUT、DELETE等)。同时还可以为每个请求设置必要的header和query参数,以及接收响应的格式(如JSON或XML)。 对于需要进行身份验证或者授权的请求,可以使用HttpClient的Credential属性来指定相应的用户名和密码。此外,还可以使用HttpClient的Timeout属性来设置超时时间,以避免请求过程中出现等待超时的问题。 在收到WebAPI的响应后,还需要对其进行解析和处理。HttpContent类提供了许多方法来获取返回的数据(如字符流、字节数组或者字符串)和解析JSON或XML格式的数据。可以将这些数据转换为相应的格式,然后在Winform应用程序中进行显示或其他操作。 总之,在Winform调用WebAPI需要使用HttpClient类发起请求和接收响应,并使用HttpContent类对返回的数据进行解析和处理。这样可以实现Winform应用程序与WebAPI的通信,从而获取所需的数据或执行某些操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值