用AJAXEnabledWebApplication的形式开发ajax项目时,调用webservice时,在客户端老是报javascript的错误,说webservice未定义。我弄了一天。MD,终于知道是什么原因了。现在写出来,希望能帮助其他人。
当我们用website的形式开发时,webservice的代码是放在app_code文件夹里面。这个文件夹是比较特别的,在这里这个文件夹里面的类,在外面是可以直接用的。
但是用WebApplication开发时。由于采用了不同的形式进行代码管理。所以多有个namespace的属性。这个时候问题就出现。一模一样的代码在website里面调试成功的。但是到WebApplication死活不能过去。(而且网上好多的代码多是写成那样啊。真是害人啊)为什么过不去呢。主要是因为我们在调用webservice时,少了namespace的这个属性。导致根本找不到webservice。现在将代码贴出:
webstie 形式:
//webservice 代码
using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services; //ajax请求webservice
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService] //ajax请求webservice
public class WebService : System.Web.Services.WebService {
public WebService () {
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod]
public string HelloWorld() {
return "Hello World";
}
}
当我们在页面调用这个webservice时
//脚本
<script type="text/javascript">
function Test()
{
requestSimpleService = WebService1.HelloWorld();
alert(requestSimpleService )
}
</script>
//页面
<form />
如果没有问题的话,肯定会出现HelloWorld方法的返回值的。
WebApplication 形式:
//webservice代码
using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Web.Script.Services;
namespace AJAXWebApp //就是这里,在客户端调用时,一定要写namespace
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
[ScriptService]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
}
}
当我们在页面调用这个webservice时
//脚本
<script type="text/javascript">
function Test()
{
requestSimpleService = AJAXWebApp.WebService1.HelloWorld(); //这个地方与webstie调用是不同的。
alert(requestSimpleService )
}
</script>
//页面
<form />
</Services>
</asp:ScriptManager>
</form>
想要使用ASP.NET AJAX在客户端JavaScript中异步调用服务器端Web Service,我们需要:
- 为Web Service类或需要暴露给客户端的Web Service方法添加[ScriptService]属性;
- 为Web Service中需要暴露给客户端的方法添加[WebMethod]属性;
- 在页面中的ScriptManager控件中添加对该Web Service的引用;
-
在客户端使用如下JavaScript语法调用该Web Service:
[NameSpace].[ClassName].[MethodName](param1, param2 ......, callbackFunction) [重要] - 为客户端异步调用指定回调函数,在回调函数中接收返回值并进一步处理。