dojo調用.net webservice並返回json


1.首先准備webservice,如下:

 

    [WebService(Namespace = "http://weibo.com/yelloweast")]
    [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調用:

 

 

    <script type="text/javascript">
        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會引發上面提到的各種錯誤。

這個地方我還沒搞明白為什么,希望有朋友能幫我解惑。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM