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會引發上面提到的各種錯誤。
這個地方我還沒搞明白為什么,希望有朋友能幫我解惑。