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会引发上面提到的各种错误。

这个地方我还没搞明白为什么,希望有朋友能帮我解惑。

 

posted on 2012-02-09 19:34  yelloweast  阅读(2971)  评论(5编辑  收藏  举报