服务器端释放WebService方法
名词解释
Ajax技术:异步刷新(javascript)
Ajax.Net:基于asp.net框架是一个ajax框架(不是微软体统的框架)
Asp.net Ajax: 微软提供的框架
编写一个普通的Asp.net webservice
为WebSrvice类添加自定义属性标记
-ScriptServiceAttribute
释放WebService方法
- 访问级别为public
-使用WeMethidAttribute
为页面中ScriptManager(Proxy)引入asmx文件
客户端访问WebService
[Namespaces.]ClassName.MethodName
依次传入参数
传入一个方法作为成功后的回调函数
即使没有返回值也会调用回调函数
InlineScript=false 将会调用代理
页面的代码
1
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="1_WebServiceFoundation.aspx.cs" Inherits="_1_WebServiceFoundation" %>
2![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
3
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
5
<html xmlns="http://www.w3.org/1999/xhtml" >
6
<head runat="server">
7
<title>Untitled Page</title>
8
</head>
9
<body>
10
<form id="form1" runat="server">
11
<asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Debug">
12
<Services>
13
<asp:ServiceReference Path="WebServiceFoundation.asmx" InlineScript="true" />
14
</Services>
15
</asp:ScriptManager>
16
17
<input type="button" value="Get Random" onclick="getRandom()" />
18
<input type="button" value="Get Range Random" onclick="getRandom(50, 100)" />
19
20
<script language="javascript" type="text/javascript">
21
function getRandom(minValue, maxValue)
22
{
23
if (arguments.length != 2)
24
{
25
Sample.WebServiceFoundation.GetRandom(getRandomSucceeded);
26
}
27
else
28
{
29
Sample.WebServiceFoundation.GetRangeRandom(minValue, maxValue, getRandomSucceeded);
30
}
31
}
32
33
function getRandomSucceeded(result)
34
{
35
alert(result);
36
}
37
</script>
38
</form>
39
</body>
40
</html>
41
对应的的Webservice
1
<%@ WebService Language="C#" Class="Sample.WebServiceFoundation" %>
2![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
3
using System;
4
using System.Web;
5
using System.Web.Services;
6
using System.Web.Services.Protocols;
7
using System.Web.Script.Services;
8![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
9
namespace Sample
10
{
11
[WebService(Namespace = "http://tempuri.org/")]
12
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
13
[ScriptService]
14
public class WebServiceFoundation : System.Web.Services.WebService
15
{
16
[WebMethod]
17
public int GetRandom()
18
{
19
return new Random(DateTime.Now.Millisecond).Next();
20
}
21![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
22
[WebMethod]
23
public int GetRangeRandom(int minValue, int maxValue)
24
{
25
return new Random(DateTime.Now.Millisecond).Next(minValue, maxValue);
26
}
27
}
28
}
客户端访问PageMethod
服务器端
只能在aspx页面中定义
只能那个是公开静态方法
使用WebMethodAttribute标记
ScriptManager的EnablePageMethods属性设置为true
客户端
通过PageMethods.MethodName 访问
//得到国际标准时间
DateTime.UtcNow
对应代码2
1
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="2_PageMethods.aspx.cs" Inherits="_2_PageMethods" %>
2![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
3
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
5
<html xmlns="http://www.w3.org/1999/xhtml" >
6
<head runat="server">
7
<title>Untitled Page</title>
8
</head>
9
<body>
10
<form id="form1" runat="server">
11
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
12
13
<input type="button" value="Get Current Time" onclick="getCurrentTime()" />
14
15
<script language="javascript" type="text/javascript">
16
function getCurrentTime()
17
{
18
PageMethods.GetCurrentTime(getCurrentTimeSucceeded);
19
}
20
21
function getCurrentTimeSucceeded(result)
22
{
23
alert(result);
24
}
25
</script>
26
</form>
27
</body>
28
</html>
29
1
using System;
2
using System.Data;
3
using System.Configuration;
4
using System.Collections;
5
using System.Web;
6
using System.Web.Security;
7
using System.Web.UI;
8
using System.Web.UI.WebControls;
9
using System.Web.UI.WebControls.WebParts;
10
using System.Web.UI.HtmlControls;
11
using System.Web.Services;
12![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
13
public partial class _2_PageMethods : System.Web.UI.Page
14
{
15
protected void Page_Load(object sender, EventArgs e)
16
{
17![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
18
}
19![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
20
[WebMethod]
21
public static DateTime GetCurrentTime()
22
{
23
return DateTime.UtcNow;
24
}
25
}
26
错误处理
调用时可以提供一个额外的错误回调函数
包括超时和服务器抛出的异常
超时智能设置在WebService对象上
设置在PageMethods对象上
无法在每个MethodCall时指定
Sys.Net.WebServiceError
复杂数据类型基础
公有属性或公有Field会被释放和接受
容器对象
实现IList接口的对象
实现IDictionary接口的对象
Key必须是String
1
<script language="javascript" type="text/javascript">
2![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
3
function doubleSalary()
4![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
5
{
6![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
7
//注意怎么传入一个复杂的数据的
8![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
9
var employee = new Object();
10![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
11
employee.FirstName = "Jeffrey";
12![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
13
employee.LastName = "Zhao";
14![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
15
employee.Salary = 1000;
16![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
17
18![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
19
ComplexType.DoubleSalary(employee, doubleSalarySucceeded);
20![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
21
}
22![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
23
24![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
25
function doubleSalarySucceeded(result)
26![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
27
{
28![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
29
var message = String.format(
30![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
31
"First Name: {0}\nLast Name: {1}\nFull Name: {2}\nSalary: {3}",
32![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
33
result.FirstName,
34![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
35
result.LastName,
36![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
37
result.FullName,
38![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
39
result.Salary);
40![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
41
42![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
43
alert(message);
44![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
45
}
46![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
47
客户端代理使用细节
函数调用完整性
Invoke(ar1,…,argN,onSucceded,onFailed,userContext)
回调函数完整性
onSucceeded(result,userContext,methodName)
onFailed(result,userContext,methodName)
WebService级别默认属性
-timeout
-defaultUserContext
-defaultSucceededCallback
-defaultFailedCallback