WebService的web客户端同步、异步、多线程向服务端传入参数的数据交互方式

时间:2023-03-09 00:27:56
WebService的web客户端同步、异步、多线程向服务端传入参数的数据交互方式
接着上一章的内容,在上一章中我们知道了如何.net平台下去建立一个WebService,以及同步调用、异步调用、开线程异步调用三种客户端从服务端获取数据的方式,在本章了所要讲的,是如何将客户端的数据,传递给服务端,进行客户端和服务端的双相交互

服务端

建立UserManager.cs类,添加using System.Web.Services.Protocols;命名空间,并使它继承自SoapHeader
输入以下代码

  1. public class UserManager:SoapHeader
  2. {
  3. public string Name { get; set; }
  4. public string Pwd { get; set; }
  5. private bool CheckUser(string n,string p)
  6. {
  7. if(Name == "aaa" && Pwd == "bbb")
  8. {
  9. return true;
  10. }
  11. else
  12. {
  13. return false;
  14. }
  15. }
  16. public bool CheckUser()
  17. {
  18. return CheckUser(Name, Pwd);
  19. }
  20. }

在服务端的WSDemo.asmx文件中输入以下代码

  1. public class WSDemo : System.Web.Services.WebService
  2. {
  3. [WebMethod]
  4. public string HelloWorld()
  5. {
  6. return "Hello World";
  7. }
  8. //标准一下CheckUser()方法使用哪个SoapHeader进行校验,客户端网站调用该方法时需要指定自己定义的SoapHeader内容
  9. //这样,虽然CheckUser()并没有参数,但在在使用时,要先定义UserManager的SoapHeader的头,放在CheckUser中
  10. public UserManager um;
  11. [SoapHeader("um")]
  12. [WebMethod(Description = "用户验证")]
  13. public bool CheckUser()
  14. {
  15. if (um.CheckUser())
  16. {
  17. return true;
  18. }
  19. else
  20. {
  21. return false;
  22. }
  23. }
  24. }

至此,服务端操作完毕

客户端---同步方式

操作完服务端后,要在ServiceReference1上右击“更新服务引用”

WebService的web客户端同步、异步、多线程向服务端传入参数的数据交互方式

图10
在Index.aspx.cs中输入以下代码:

  1. public partial class Index : System.Web.UI.Page
  2. {
  3. protected string stator = string.Empty;
  4. protected void Page_Load(object sender, EventArgs e)
  5. {
  6. using (ServiceReference1.WSDemoSoapClient wsc = new WSDemoSoapClient())
  7. {
  8. //UserManager服务端中的类名
  9. ServiceReference1.UserManager um = new UserManager();
  10. um.Name = "aaa";
  11. um.Pwd = "bbb";
  12. stator = wsc.CheckUser(um)?"登录成功":"用户名或密码错误";//三目运算符,更据服务端返回值确定向浏览器输出内容
  13. }
  14. Response.Write(stator);
  15. }
  16. }

至此,客户端操作完毕,此时可发现在用户名和密码不对的情况下,浏览器所输入的值

客户端---异步方式

将Index.aspx.cs中的代码修改为以下方式

  1. public partial class Index : System.Web.UI.Page
  2. {
  3. protected string stator = string.Empty;
  4. protected void Page_Load(object sender, EventArgs e)
  5. {
  6. using (ServiceReference1.WSDemoSoapClient client = new WSDemoSoapClient())
  7. {
  8. //要执行的方法
  9. client.CheckUserCompleted += new EventHandler<CheckUserCompletedEventArgs>(client_CheckUserCompleted);
  10. //为传参做准备,因为添加了“服务引用”所以在客户端也能点出服务端中公布的的方法来
  11. ServiceReference1.UserManager um = new UserManager();
  12. um.Name = "aaa";
  13. um.Pwd = "bbb";
  14. //开始执行
  15. client.CheckUserAsync(um);
  16. }
  17. }
  18. //要执行的方法
  19. void client_CheckUserCompleted(object sender, CheckUserCompletedEventArgs e)
  20. {
  21. stator = e.Result ? "登录成功" : "登录失败";
  22. Response.Write(stator);
  23. }
  24. }

客户端---开线程的异步方式

将Index.aspx.cs中代码更改为以下形式

  1. public partial class Index : System.Web.UI.Page
  2. {
  3. protected string stator = string.Empty;
  4. protected void Page_Load(object sender, EventArgs e)
  5. {
  6. BackgroundWorker bw = new BackgroundWorker();
  7. bw.DoWork += new DoWorkEventHandler(bw_DoWork);//指明线程要执行方法
  8. bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);//获取从服务端中的返回值
  9. bw.RunWorkerAsync();//开始执行
  10. }
  11. //获取从服务端中的返回值
  12. void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  13. {
  14. stator = (bool)e.Result ? "登录成功" : "登录失败";
  15. Response.Write(stator);
  16. }
  17. //指明线程要执行方法
  18. void bw_DoWork(object sender, DoWorkEventArgs e)
  19. {
  20. //建立客户端和服务端的链接
  21. using (ServiceReference1.WSDemoSoapClient client = new WSDemoSoapClient())
  22. {
  23. //对服务端公布方法UserManager进行实例化并赋值
  24. UserManager um = new UserManager();
  25. um.Name = "aaa";
  26. um.Pwd = "bbb";
  27. //调用服务端方法,并传入参数
  28. e.Result = client.CheckUser(um);//注意e.Result = ...
  29. }
  30. }
  31. }

至此,开线程异步客户端传参与服务器数据交互操作完毕

出处:https://blog.csdn.net/zhangquanok/article/details/15338697