1.首先准备webservice,如下:
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public string SayHello(string name)
{
return "Hello " + name;
}
[WebMethod]
public People Hello()
{
People p = new People();
p.Name = "Yellow East";
p.Age = 27;
return p;
}
public class People
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
}
}
说明,这里重点是需要打开客户端脚本支持,即加上[System.Web.Script.Services.ScriptService]。
2. 客户端通过dojo调用:
function init() {
//将待传入的Web方法参数转换为json格式
var myname = dojo.toJson({ "name": "yelloweast" });
//构造dojo.xhrPost方法的参数
var xhrArgs = {
//web service的地址,具体到方法名称,不能在此接参数
url: "http://esri-huangd/WaterEnvironment/services/WebService1.asmx/SayHello",
//让web service以json方式对待传入的参数
handleAs: "json",
headers: { "Content-Type": "application/json" },//或者contentType: "application/json",
//如果web方法没有参数,则下一行可不写(写了也没事儿)
postData: myname,
//调用成功时的处理函数
load: loadHandler,
//调用失败时的处理函数
error: errorHandler
};
//以POST方式调用web service
dojo.xhrPost(xhrArgs);
}
function loadHandler(response) {
//直接取出返回的数据,如SayHello方法返回的结果:Hello yelloweast
alert(response.d);
//取出返回的对象的属性,如Hello方法返回的结果:Yellow East
//alert(response.d.Name);
}
function errorHandler(error) {
alert(error);
}
dojo.addOnLoad(init);
</script>
说明:response返回的结果,需要通过response.d来获取具体的对象,例如SayHello返回的字符串对象,或者Hello返回的People对象,而对于People对象,还可以通过response.d.Name获取其具体的属性;
3.关于postData和content
对于需要接收参数的Web方法,我也尝试过用content的方式来传入方法参数,结果总是出现各种错误:“无效的json基元:name”,以及“Web 服务调用无效,参数"name"缺少值”等。
读者可将postData: myname替换为content: myname进行测试,如果调用无参数的Web方法,则该属性被忽略,运行正常,如果是需要参数的Web方法,则使用content: myname会引发上面提到的各种错误。
这个地方我还没搞明白为什么,希望有朋友能帮我解惑。