加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

客户端访问WebService(1)

发布时间:2020-12-17 02:36:49 所属栏目:安全 来源:网络整理
导读:1,客户端访问WebService基础 ?? 步骤:新建一个普通的webService ?? ? ? ? ? ?为webService类添加自定义标记属性[ScriptService]Attibute ?? ? ? ? ? ?释放webService方法 ?a,访问级别public;? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?b,给方法添加[Web
1,客户端访问WebService基础
?? 步骤:新建一个普通的webService
?? ? ? ? ? ?为webService类添加自定义标记属性[ScriptService]Attibute
?? ? ? ? ? ?释放webService方法 ?a,访问级别public;?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?b,给方法添加[WebMethod]Attribute
?? ? ? ? ? ?为页面中的ScriptManager或者ScriptManagerProxy注册webService

?? 客户端代码方法webService方法:
?? ? ? ? ? 如果webService的代码类有命名空间,命名空间下的类的名字的方法名字
?? ? ? ? ? 1,[NameSpaceName].ClassName.MethodName() ??
?? ? ? ? ? 2,依次传入参数
?? ? ? ? ? 3,传入一个方法作为成功后的回调函数
?? ? ? ? ? 4,即时没有返回值,也会调用回调函数
???
下面是简单的例子:

webService中的内容
  1. using?System;
  2. using?System.Collections;
  3. using?System.ComponentModel;
  4. using?System.Data;
  5. using?System.Web;
  6. using?System.Web.Services;
  7. using?System.Web.Services.Protocols;
  8. namespace?AJAXEnabledWebApplication2
  9. {
  10. ????///?<summary>
  11. ????///?WebService1?的摘要说明
  12. ????///?</summary>
  13. ????[WebService(Namespace?=?"http://tempuri.org/")]
  14. ????[WebServiceBinding(ConformsTo?=?WsiProfiles.BasicProfile1_1)]
  15. ????[ToolboxItem(false)]
  16. ????//为类添加自己定义属性[ScriptService]
  17. ????[System.Web.Script.Services.ScriptService]
  18. ????public?class?WebService1?:?System.Web.Services.WebService
  19. ????{
  20. ????????//释放WebService方法
  21. ????????[WebMethod]
  22. ????????public?int?GetRandom()
  23. ????????{
  24. ????????????return?new?Random(DateTime.Now.Millisecond).Next();
  25. ????????}
  26. ????????[WebMethod]
  27. ????????public?int?GetRandomBetween(int?min,?int?max)
  28. ????????{
  29. ????????????return?new?Random(DateTime.Now.Millisecond).Next(min,?max);
  30. ????????}
  31. ????????[WebMethod]
  32. ????????public?void?Test()
  33. ????????{
  34. ????????}
  35. ????}
  36. }
页面中的内容 :
  1. <%@?Page?Language="C#"?AutoEventWireup="true"?CodeBehind="Default.aspx.cs"?Inherits="AJAXEnabledWebApplication2._Default"?%>
  2. <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html?xmlns="http://www.w3.org/1999/xhtml"?>
  4. <head?runat="server">
  5. ????<title>Untitled?Page</title>
  6. </head>
  7. <body>
  8. ????<form?id="form1"?runat="server">
  9. ??????<!--InlineScript为true的时候webservice的方法生成的script代码会释放在页面中,默认为false-->
  10. ????????<asp:ScriptManager?ID="ScriptManager1"?runat="server"?>
  11. ????????<Services>
  12. ????????<asp:ServiceReference?Path="WebService1.asmx"?InlineScript="true"?/>
  13. ????????</Services>
  14. ????????</asp:ScriptManager>
  15. ????????<div>
  16. ????????<input?type="button"?value="无返回值"?onclick="test()"?/>
  17. ????????<input?type="button"?value="无参数返回一个随机数字"?onclick="GetRandom()"?/>
  18. ????????<input?type="button"?value="返回一个0到100之间的随机数字"?onclick="GetRandom(0,100)"?/>
  19. ????????<script?type="text/javascript"?language="javascript">
  20. ????????
  21. ????????function?GetRandom(max,min){
  22. ????????//js函数默认的属性,argument?参数信息,一种js重载的实现方法
  23. ???????????if(arguments.length!=2){
  24. ????????????????AJAXEnabledWebApplication2.WebService1.GetRandom(successed);
  25. ????????????}
  26. ????????????else{
  27. ?????????????????AJAXEnabledWebApplication2.WebService1.GetRandomBetween(max,min,successed);
  28. ????????????}
  29. ????????}
  30. ????????function?test(){
  31. ???????????//无返回值,回调函数会弹出个null值
  32. ????????????AJAXEnabledWebApplication2.WebService1.Test(successed);
  33. ????????}
  34. ????????function?successed(result){
  35. ????????????alert(result);
  36. ????????}
  37. ????????</script>
  38. ????????</div>
  39. ????</form>
  40. </body>
  41. </html>

2,客户端访问PageMethod基础

服务器端步骤:客户端对应的服务器段的aspx页面中定义
?? ? ? ? ? ? ? ? ? ? 公开的静态方法
?? ? ? ? ? ? ? ? ? ? 方法上面使用[WebMethod]Attribute
?? ? ? ? ? ? ? ? ? ? ScriptManager的EnablePageMethod属性为true

客户端方法:通过PageMethods.MethodName()方法访问

简单例子:?
后台类:
  1. using?System;
  2. using?System.Collections;
  3. using?System.Configuration;
  4. using?System.Data;
  5. using?System.Web;
  6. using?System.Web.Security;
  7. using?System.Web.UI;
  8. using?System.Web.UI.HtmlControls;
  9. using?System.Web.UI.WebControls;
  10. using?System.Web.UI.WebControls.WebParts;
  11. namespace?AJAXEnabledWebApplication2
  12. {
  13. ????public?partial?class?WebForm1?:?System.Web.UI.Page
  14. ????{
  15. ????????protected?void?Page_Load(object?sender,?EventArgs?e)
  16. ????????{
  17. ????????}
  18. ????????//向客户端释放方法
  19. ????????[System.Web.Services.WebMethod]
  20. ????????//public类型的static
  21. ????????public?static?DateTime?GetDateTimeNow()
  22. ????????{
  23. ????????????return?DateTime.UtcNow;
  24. ????????}
  25. ????}
  26. }
页面代码:

  1. <%@?Page?Language="C#"?AutoEventWireup="true"?CodeBehind="WebForm1.aspx.cs"?Inherits="AJAXEnabledWebApplication2.WebForm1"?%>
  2. <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html?xmlns="http://www.w3.org/1999/xhtml"?>
  4. <head?runat="server">
  5. ????<title>无标题页</title>
  6. </head>
  7. <body>
  8. ????<form?id="form1"?runat="server">
  9. ????<!---ScriptManager的?EnablePageMethods="true"->
  10. ????<asp:ScriptManager?ID="ScriptManager1"?runat="server"?EnablePageMethods="true">
  11. ????</asp:ScriptManager>
  12. ????<input?type="button"?value="调用pageMethod方法"?onclick="GetDateTimeNow()"?/>
  13. ????<script?type="text/javascript"?language="javascript">
  14. ????function?GetDateTimeNow(){
  15. ????//PageMethods.释放的方法名字
  16. ???????PageMethods.GetDateTimeNow(seccessed);
  17. ????}
  18. ????function?seccessed(result){
  19. ????????alert(result);
  20. ????}
  21. ????</script>
  22. ????</form>
  23. </body>
  24. </html>
3,错误处理
?? ? ? ? ?客户端调用错误处理时候可以提供一个额外的错误的回调函数
?? ? ? ? ?错误包括超时和服务器抛出的异常
?? ? ? ? ?超时只能设置在webService级别或者pageMetehod对象上 无法在方法调用时候设置

?错误信息类:Sys.Net.WebServicError
?? ? ? ? ? ? ? ? ?Sys.Net.WebServicError类提供了 timeout ?,message,exceptionType,stackTrace 4个属性

例子:

webService代码:

  1. using?System;
  2. using?System.Collections;
  3. using?System.ComponentModel;
  4. using?System.Data;
  5. using?System.Web;
  6. using?System.Web.Services;
  7. using?System.Web.Services.Protocols;
  8. namespace?AJAXEnabledWebApplication2
  9. {
  10. ????///?<summary>
  11. ????///?Error?的摘要说明
  12. ????///?</summary>
  13. ????[WebService(Namespace?=?"http://tempuri.org/")]
  14. ????[WebServiceBinding(ConformsTo?=?WsiProfiles.BasicProfile1_1)]
  15. ????[ToolboxItem(false)]
  16. ????[System.Web.Script.Services.ScriptService]
  17. ????public?class?Error?:?System.Web.Services.WebService
  18. ????{
  19. ????????[WebMethod]
  20. ????????public?int?GetDivsion(int?a,?int?b)
  21. ????????{
  22. ????????????return?a?/?b;
  23. ????????}
  24. ????????[WebMethod]
  25. ????????public?int?Timeout()
  26. ????????{
  27. ????????????//设置等待5秒后返回值
  28. ????????????System.Threading.Thread.Sleep(5000);
  29. ????????????return?0;
  30. ????????}
  31. ????}
  32. }
页面代码:

  1. <%@?Page?Language="C#"?AutoEventWireup="true"?CodeBehind="WebForm2.aspx.cs"?Inherits="AJAXEnabledWebApplication2.WebForm2"?%>
  2. <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html?xmlns="http://www.w3.org/1999/xhtml"?>
  4. <head?runat="server">
  5. ????<title>无标题页</title>
  6. </head>
  7. <body>
  8. ????<form?id="form1"?runat="server">
  9. ????<asp:ScriptManager?ID="ScriptManager1"?runat="server">
  10. ????<Services>
  11. ????<asp:ServiceReference?Path="Error.asmx"?/>
  12. ????</Services>
  13. ????</asp:ScriptManager>
  14. ????<input?id="Button1"?type="button"?value="调用一个除零函数抛出异常"?onclick="getDivsion(4,0)"?/>
  15. ??????<input?id="Button2"?type="button"?value="调用一个除非零函数得到结果"?onclick="getDivsion(4,4)"?/>
  16. ????<input?id="Button3"?type="button"?value="触发一个超时的错误"?onclick="getTimeout()"?/>
  17. ????<script?type="text/javascript"?language="javascript">
  18. ????function?getDivsion(a,b){
  19. ????????//参数后跟成功后的回调函数,和错误的回调函数?
  20. ????????AJAXEnabledWebApplication2.Error.GetDivsion(a,b,seccessed,failed);
  21. ?????
  22. ??????
  23. ????}
  24. ????function?getTimeout(){
  25. ????//这里设置等待服务器多久还没有返回数据?就给客户端提醒超时了?服务器中设置了5秒,等俩秒后会返回超时,如果设置为6000则正常返回1
  26. ????????AJAXEnabledWebApplication2.Error.set_timeout(2000);
  27. ????????AJAXEnabledWebApplication2.Error.Timeout(seccessed,failed);
  28. ????}
  29. ???????//调用成功的回调函数
  30. ???function?seccessed(result){
  31. ????????????alert(result);
  32. ????????}
  33. ????????//调用失败的回调函数
  34. ?????function?failed(error){
  35. ????????????var?message=String.format("Timeout:{0}/n?Message:{1}/n?exceptionType:{2}/n?stackTrace:{3}",
  36. ????????????error.get_timedOut(),
  37. ????????????error.get_message(),
  38. ????????????error.get_exceptionType(),
  39. ????????????error.get_stackTrace()
  40. ????????????);
  41. ????????????alert(message);
  42. ????????}
  43. ????
  44. ????</script>
  45. ????</form>
  46. </body>
  47. </html>
4,复杂数据类型使用基础

调用的时候有时候我们需要调用一些复杂的自定义的数据类型,

1,定义了自己的数据类型时候,类型的一些共有属性和字段都被释放(返回值)和接受(参数)
2,容器对象
?? ? --实现了 IList接口的对象
?? ? --实现了IDictionary接口的对象 (客户端是用一个对象来模拟字典的,所以字典数据中的key必须是string类型)

例子:
自定义类:
  1. using?System;
  2. using?System.Data;
  3. using?System.Configuration;
  4. using?System.Web;
  5. using?System.Web.Security;
  6. using?System.Web.UI;
  7. using?System.Web.UI.HtmlControls;
  8. using?System.Web.UI.WebControls;
  9. using?System.Web.UI.WebControls.WebParts;
  10. namespace?AJAXEnabledWebApplication2
  11. {
  12. ????public?class?Person
  13. ????{
  14. ????????public?string?firstName;
  15. ????????public?string?lastName;
  16. ????????public?int?age;
  17. ????????public?string?FullName
  18. ????????{
  19. ????????????get
  20. ????????????{
  21. ????????????????return?firstName?+?"?"?+?lastName;
  22. ????????????}
  23. ????????}
  24. ????????public??override?string??ToString()
  25. ????????{
  26. ????????????return?"Name:"+this.FullName+"?Age:"+age.ToString();
  27. ????????}
  28. ????}
  29. }
webService:

  1. using?System;
  2. using?System.Collections;
  3. using?System.ComponentModel;
  4. using?System.Data;
  5. using?System.Web;
  6. using?System.Web.Services;
  7. using?System.Web.Services.Protocols;
  8. namespace?AJAXEnabledWebApplication2
  9. {
  10. ????///?<summary>
  11. ????///?WebService2?的摘要说明
  12. ????///?</summary>
  13. ????[WebService(Namespace?=?"http://tempuri.org/")]
  14. ????[WebServiceBinding(ConformsTo?=?WsiProfiles.BasicProfile1_1)]
  15. ????[ToolboxItem(false)]
  16. ????[System.Web.Script.Services.ScriptService]
  17. ????public?class?WebService2?:?System.Web.Services.WebService
  18. ????{
  19. ????????[WebMethod]
  20. ????????//一个人的年龄增加了一岁
  21. ????????public?Person?AddAge(Person?p)
  22. ????????{
  23. ????????????p.age?+=?1;
  24. ????????????return?p;
  25. ????????}
  26. ????????[WebMethod]
  27. ????????//数组
  28. ????????public?System.Collections.Generic.List<int>?Reverse(System.Collections.Generic.List<int>?list)
  29. ????????{
  30. ????????????//反转数组
  31. ????????????list.Reverse();
  32. ????????????return?list;
  33. ????????}
  34. ????????[WebMethod]
  35. ????????////数据字典
  36. ????????public?System.Collections.Generic.IDictionary<string,?Person>?GetPersons()
  37. ????????{
  38. ????????????System.Collections.Generic.Dictionary<string,?Person>?result?=?new?System.Collections.Generic.Dictionary<string,?Person>();
  39. ????????????Person?p1?=?new?Person();
  40. ????????????Person?p2?=?new?Person();
  41. ????????????p1.firstName?=?"Si";
  42. ????????????p1.lastName?=?"Li";
  43. ????????????p1.age?=?23;
  44. ????????????result[p1.FullName]?=?p1;
  45. ????????????p2.age?=?25;
  46. ????????????p2.firstName?=?"Wu";
  47. ????????????p2.lastName?=?"Wang";
  48. ????????????result[p2.FullName]?=?p2;
  49. ????????????return?result;
  50. ????????}
  51. ????}
  52. }

aspx页面

  1. <%@?Page?Language="C#"?AutoEventWireup="true"?CodeBehind="WebForm3.aspx.cs"?Inherits="AJAXEnabledWebApplication2.WebForm3"?%>
  2. <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html?xmlns="http://www.w3.org/1999/xhtml"?>
  4. <head?runat="server">
  5. ????<title>无标题页</title>
  6. </head>
  7. <body>
  8. ????<form?id="form1"?runat="server">
  9. ????<asp:ScriptManager?ID="ScriptManager1"?runat="server">
  10. ????<Services>
  11. ????<asp:ServiceReference?Path="WebService2.asmx"?/>
  12. ????</Services>
  13. ????</asp:ScriptManager>
  14. ????<input?id="Button1"?type="button"?value="年龄增加一岁"?onclick="AddAge()"?/>
  15. ????<input?id="Button2"?type="button"?value="反转数组[1,2,3,4,5,6s]"?onclick="revers([1,6])"?/>
  16. ????<input?id="Button3"?type="button"?value="返回一个数据字典数据"?onclick="getPersons()"?/>
  17. ????<script?language="javascript"?type="text/javascript">
  18. ????//年龄增加一岁
  19. ????function?AddAge(){
  20. ????????var?person=new?Object();
  21. ???????person.firstName="Stone";
  22. ???????person.lastName="Zhang";
  23. ???????person.age=23;
  24. ???????//调用webservice中的年龄增加一岁的方法?
  25. ???????AJAXEnabledWebApplication2.WebService2.AddAge(person,AddAgeseccessed);
  26. ????}
  27. ????function?AddAgeseccessed(result){
  28. ????????//结果是24
  29. ????????var?message=String.format("FirstName:{0}/n?LastName:{1}/nFullName:{2}/nAge:{3}",
  30. ????????result.firstName,
  31. ????????result.lastName,
  32. ????????result.FullName,
  33. ????????result.age
  34. ????????);
  35. ?????????alert(message);
  36. ????}
  37. ????//数组
  38. ????function?revers(array){
  39. ?????AJAXEnabledWebApplication2.WebService2.Reverse(array,seccessed);
  40. ????}
  41. ????function?seccessed(result){
  42. ????????alert(result);
  43. ????}
  44. ????//数据字典
  45. ????
  46. ????function?getPersons(){
  47. ?????????AJAXEnabledWebApplication2.WebService2.GetPersons(getPersonsSeccssed);
  48. ????}
  49. ????function?getPersonsSeccssed(result){
  50. ????//枚举字典中的每一项
  51. ????//这里得不到字典对象中的方法
  52. ????????for(var?key?in?result){
  53. ????????????alert(key+":?"+result[key].age);
  54. ????????}
  55. ????}
  56. ????</script>
  57. ????</form>
  58. </body>
  59. </html>
5,客户端代理使用基础

客户端函数调用完整签名:
?? ?Invoke(arg1,...,argN,onSucceeded,onFailed,userContext)
?? ?参数,成功时的回调函数,出错后的回调函数,userContext为任意的自定义类型(可以传入数据字典)
回调函数完整签名:
?? ?onSucceeded(result,userContext,methodName)
?? ?结果,调用函数传入的userContext
?? ?onFailed(error,methodName)
?? ? error对象

?webservice级别默认属性:
??-timeout 比较常用
??-defaultUserContext
??-defaultSucceededCallBack
??-defaultFailedCallBack 比较常用,出错后调用统一的webservice中默认的

例子:

webservice代码用了上面用过的一个webservice:

  1. using?System;
  2. using?System.Collections;
  3. using?System.ComponentModel;
  4. using?System.Data;
  5. using?System.Web;
  6. using?System.Web.Services;
  7. using?System.Web.Services.Protocols;
  8. namespace?AJAXEnabledWebApplication2
  9. {
  10. ????///?<summary>
  11. ????///?Error?的摘要说明
  12. ????///?</summary>
  13. ????[WebService(Namespace?=?"http://tempuri.org/")]
  14. ????[WebServiceBinding(ConformsTo?=?WsiProfiles.BasicProfile1_1)]
  15. ????[ToolboxItem(false)]
  16. ????[System.Web.Script.Services.ScriptService]
  17. ????public?class?Error?:?System.Web.Services.WebService
  18. ????{
  19. ????????[WebMethod]
  20. ????????public?int?GetDivsion(int?a,?int?b)
  21. ????????{
  22. ????????????return?a?/?b;
  23. ????????}
  24. ????????[WebMethod]
  25. ????????public?int?Timeout()
  26. ????????{
  27. ????????????//设置等待5秒后返回值
  28. ????????????System.Threading.Thread.Sleep(5000);
  29. ????????????return?0;
  30. ????????}
  31. ????}
  32. }
asp页面代码:

  1. <%@?Page?Language="C#"?AutoEventWireup="true"?CodeBehind="WebForm4.aspx.cs"?Inherits="AJAXEnabledWebApplication2.WebForm4"?%>
  2. <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html?xmlns="http://www.w3.org/1999/xhtml"?>
  4. <head?runat="server">
  5. ????<title>无标题页</title>
  6. </head>
  7. <body>
  8. ????<form?id="form1"?runat="server">
  9. ?????<asp:ScriptManager?ID="ScriptManager1"?runat="server">
  10. ????<Services>
  11. ????<asp:ServiceReference?Path="Error.asmx"?/>
  12. ????</Services>
  13. ????</asp:ScriptManager>
  14. ????<input?id="Button1"?type="button"?value="调用一个除零函数抛出异常"?onclick="getDivsion(4,0)"?/>
  15. ??????<input?id="Button2"?type="button"?value="调用一个除非零函数得到结果"?onclick="getDivsion(4,4)"?/>
  16. ????<input?id="Button3"?type="button"?value="触发一个超时的错误"?onclick="getTimeout()"?/>
  17. ????<script?type="text/javascript"?language="javascript">
  18. ????//webmethod默认属性
  19. ????AJAXEnabledWebApplication2.Error.set_defaultFailedCallback(failed);
  20. ????AJAXEnabledWebApplication2.Error.set_timeout(2000);
  21. ????function?getDivsion(a,b){
  22. ????????//参数后跟成功后的回调函数,和错误的回调函数?
  23. ???????//?AJAXEnabledWebApplication2.Error.GetDivsion(a,failed);
  24. ???????//去掉了上面的出错的回调函数,系统会默认找set_defaultFailedCallBack()
  25. ???????AJAXEnabledWebApplication2.Error.GetDivsion(a,seccessed);
  26. ?????
  27. ??????
  28. ????}
  29. ????function?getTimeout(){
  30. ????//这里设置等待服务器多久还没有返回数据?就给客户端提醒超时了?服务器中设置了5秒,等俩秒后会返回超时,如果设置为6000则正常返回1
  31. ??????//??AJAXEnabledWebApplication2.Error.set_timeout(2000);
  32. ??????//??AJAXEnabledWebApplication2.Error.Timeout(seccessed,failed);
  33. ??????AJAXEnabledWebApplication2.Error.Timeout(seccessed);
  34. ????}
  35. ???????//调用成功的回调函数
  36. ???function?seccessed(result){
  37. ????????????alert(result);
  38. ????????}
  39. ????????//调用失败的回调函数
  40. ?????function?failed(error){
  41. ????????????var?message=String.format("Timeout:{0}/n?Message:{1}/n?exceptionType:{2}/n?stackTrace:{3}",
  42. ????????????error.get_stackTrace()
  43. ????????????);
  44. ????????????alert(message);
  45. ????????}
  46. ????
  47. ????</script>
  48. ????</form>
  49. </body>
  50. </html>

目前就了解了这些总结下~

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读