1.webService部署好后只能本地访问。提示““测试窗体只能用于来自本地计算机的请求”,解决方法是在Web.config的<system.web>节,增加以下内容:
<webServices>
<protocols>
<add name="HttpSoap"/>
<add name="HttpPost"/>
<add name="HttpGet"/>
<add name="Documentation"/>
</protocols>
</webServices>
2. 回调函数的两种形式:
(1)第一种回调函数为JS代码中一个JS函数调用另外一个JS函数。回调函数可以这样理解,函数A有一个参数,但是这个参数不是通常的变量,而是另外一个函数的函数名称B。以下面的代码为例:
<script type="text/javascript" language="javascript">
function parentFun(huidiao) {
alert("我是主函数");
huidiao();
}
function HuiDiao() {
alert("我是回调函数");
}
function Test() {
parentFun(HuiDiao);
}
</script>
看上面代码中的
Test函数,该函数调用了parentFun函数,
但是该函数的参数不是一个变量,而是另外一个函数HuiDiao,当执行主函数后还会再次执行参数函数,也就是HuiDiao()这个函数。所以我们说HuiDiao()函数是parentFun()函数的回调函数。
(2)第二种回调函数是回调函数将主函数执行后返回的结果作为回调函数的参数。这种函数主要以JS函数调用webservice后台方法来说明:
html代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ScriptManagerTest.aspx.cs"
Inherits="ScriptManagerTest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>演示ScriptManager的基本用法</title>
<script language="javascript" type="text/javascript">
//调用web服务
function GetDataFromWebService() {
WebService.Welcome(ShowResult);
}
//回调函数,显示从服务端获得的结果
function ShowResult(result) {
alert(result);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
<%--对脚本的调用,其中可以嵌套多个ScriptReference模板,以实现对多个脚本文件的调用--%>
<Scripts>
<asp:ScriptReference Path="JavaScript/JsmTest.js" />
</Scripts>
<%--对Web服务的调用,其中可以嵌套多个ScriptReference模板,以实现对多个脚本文件的调用--%>
<Services>
<asp:ServiceReference Path="WebServices/WebService.asmx" />
</Services>
<%--自动创建复合脚本。注:若要合并脚本,请按照您要将脚本包括在复合脚本中的顺序,添加 CompositeScript 元素并列出脚本引用。--%>
<CompositeScript>
</CompositeScript>
<%--用来表示提供验证服务的路径--%>
<AuthenticationService />
<%-- 表示提供个性化服务的路径--%>
<ProfileService />
</asp:ScriptManager>
<div>
<input id="MyButton1" type="button" value="获取Web服务" οnclick="GetDataFromWebService()" />
<input id="MyButton2" type="button" value="调用JS方法" οnclick="GetDataFromJS()" />
</div>
</form>
</body>
</html>
webservice 提供的方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
/// <summary>
///WebService 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
//若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {
public WebService () {
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod]
public string Welcome() {
return "Hello World From Web服务";
}
}
请注意html代码中的JS代码,GetDataFromWebService()函数中WebService.WelCome(ShowResult)是一个典型的回调函数的应用。ShowResult函数将WebService.WelCome()函数的返回结果作为参数传入ShowResult函数,这样便可以直接弹出提示框“Hell World From Web 服务”。但是很多人认为如果想要实现弹出提示框这样的效果JS代码该这样写:
<script language="javascript" type="text/javascript">
//调用web服务
function GetDataFromWebService() {
var a = WebService.Welcome();
ShowResult(a);
}
//回调函数,显示从服务端获得的结果
function ShowResult(result) {
alert(result);
}
</script>
经过Demo测试我们发现这样是行不通的,原因在于var a = WebService.WelCome()这行代码并不能将WebService端的函数执行结果返回到前台代码并赋值给a。但是用回调函数就能方便的实现这个功能,回调函数的机制在于回调函数将调用该回调函数的主函数的返回结果存在一个变量中,然后再对该变量进行操作,说起来挺复杂,直接代码说明,用下面这样的JS不但能实现与原来相同的效果,同时也很好的说明了回调函数的运行机制:
<script language="javascript" type="text/javascript">
//调用web服务
var b;
function GetDataFromWebService() {
WebService.Welcome(ShowResult);
alert(b);
}
//回调函数,显示从服务端获得的结果
function ShowResult(result) {
b = result;
}
</script>
现在对于回调函数你懂了吗?
(3)JS文件中文字符显示为乱码。可以尝试三种方法。
第一种是在引用JS文件的页面上显示的给出JS文件的编码方式使之与JS的编码方式相一致。所以在新建JS文件的时候一定要确定该js文件的Text file encoding。
第二种是查看所使用浏览器的编码方式是否与所制作的web页面的编码方式一样。如果不一样则应改变浏览器的编码方式使之与所制作的页面的编码方式一致。
前两种方法应用于在JS文件中中文字符显示正常,但在网页中显示不正常。第三种方法应用于在JS文件中中文字符显示不正常。方法是将用notepad打开该JS文件,你可以看到在notepad中JS文件里的中文字符显示正常。这时可以拷贝notepad里的js代码重新贴回JS文件中。