jquery调用WebService和WebService输出JSON

(环境:vs2008+jquery1.2.3)
发现.net自带的ajax.net使用webservice输出的是json,其中关键的就是在请求时:Content-Type:application/json;utf-8
所以我们只要在POST时加上一个Content-Type:application/json;utf-8就可以了

 $.ajax({
   type: "POST",
   contentType:"application/json;utf-8",
   url: "/Server/PicLib.asmx/HelloWorld",
   success: function(msg){
   var json = eval('(' + msg + ')');
   alert(json.d);}
});


var json = eval('(' + msg + ')');
(这个是把返回的字符值转换成json对象,这样子才能够正常的操作json,这里可以用try来捕捉一下错误,因为如果返回的字符串不是标准的json的话就会出错。)

上面的js要成功运行需要对.net做一下设置让“WebService输出JSON”
修改WebService,导入一个属性

<System.Web.Script.Services.ScriptService()> 

<System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class WebService1
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    Public Function HelloWorld(ByVal str As String, ByVal name As String) As String
        Return str & name
    End Function

End Class



在webconfig中添加:

    <httpHandlers>
      
<remove verb="*" path="*.asmx"/>
      
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    
</httpHandlers>


注意:这个是关键,这样子才能使请求asmx文件时让它输出json格式,刚刚开始时测试了很久都不行。

在vs2008 简体中文版+jquery 1.2.3下通过测试。


在测试过程中“顺便”发现了jq的一个"BUG"
在设置Content-Type时,发现怎么样设置jq总是不理不踩,
查看了一下jq的ajax方法哪一段源码,看到了如下的代码:

            if ( s.data )
                xml.setRequestHeader(
"Content-Type", s.contentType);
上面的data是ajax请示的参数,当参数值不为空才设置请求的Content-Type
我不知道这个到底是不是它的bug,在实际使用的时,你会碰到在调用webservice的一个方法,而这个方法是没有参数时,这样子
果你不想修改jq的源码的话,就在请求时附加一些无用的数据,如:data:"{}",不然jq可是会发“烂咂”(脾气)哦~呵呵

以上的问题还请使用jq的朋友们注意一下。

应朋友们的要求我写了个简单的演示,源码里已写好注释了,请大家查看相关的源码
演示是vs2008(vb)写的,下载源码
posted @ 2008-03-04 11:50 没剑 阅读(752) 评论(11)  编辑 收藏 所属分类: JQuery

  回复  引用  查看    
#1楼 2008-03-06 01:14 | finull      
如果有参数的时候应该怎么提交ajax?

web服务
  public string sayHello(string name)
我用prototype提交ajax
new Ajax.Request("Utilities.asmx/sayHello",{
  contentType:"application/json",
  method:"post",
  parameters:"name="+$F("helloName"),
  onSuccess:helloResponse
});
可是返回 "Invalid JSON primitive: name. " 错误,怎么回事。
用jq提交带参数的ajax怎么做的?
  回复  引用  查看    
#2楼 [楼主]2008-03-06 11:01 | 没剑      
--引用--------------------------------------------------
finull: 如果有参数的时候应该怎么提交ajax?

web服务
  public string sayHello(string name)
我用prototype提交ajax
new Ajax.Request("Utilities.asmx/sayHello",{
  contentType:"application/json",
  method:"post",
  parameters:"name="+$F("helloName"),
  onSuccess:helloResponse
});
可是返回 "Invalid JSON primitive: name. " 错误,怎么回事。
用jq提交带参数的ajax怎么做的?
--------------------------------------------------------
因为你是用json格式提交,所以你的参数要用回json的标准格式,不然它格式化你的参数时就会出错:parameters:"name="+$F("helloName")
parameters:"{name=\""+$F("helloName")+"\"}"

  回复  引用  查看    
#3楼 2008-03-06 13:27 | finull      
已经解决了
parameters:'{"name":"'+$F("helloName")+'"}'
不用prototype
function sayHello(){
  var request=getRequest();
  var url="Utilities.asmx/sayHello";
  var params='{"name":"'+$F("helloName")+'"}';
  request.open("POST",url,false);
  request.setRequestHeader("Content-Type","application/json");
  request.onreadystatechange=function(){
    if(request.readyState ==4){
      if(request.status==200){
        $("output").innerHTML=request.responseText.evalJSON().d;
      }
    }
  };
  request.send(params);
}
用prototype
function sayHello(){
  var url="Utilities.asmx/sayHello";
  var params='{"name":"'+$F("helloName")+'"}';
  new Ajax.Request(url,{
    contentType:"application/json",
    method:"post",
    parameters:params,
    onSuccess:function(transport){
      $("output").innerHTML=transport.responseText.evalJSON().d;
    }
  });
}

这两个按说应该是一样的效果吧?可以第一个能成功返回
第二个确不能?郁闷
  回复  引用  查看    
#4楼 [楼主]2008-03-06 15:04 | 没剑      
对不起,我没有用过prototype,对这个不是很熟悉
我觉得你可以用ff的firebug来测试一下请求和返回的东西
  回复  引用  查看    
#5楼 2008-03-06 17:23 | finull      
恩,我就是用firebug来测试的...
不过现在有第一个方法就够了,呵呵 谢谢你
  回复  引用  查看    
#6楼 [楼主]2008-03-06 21:26 | 没剑      
--引用--------------------------------------------------
finull: 恩,我就是用firebug来测试的...
不过现在有第一个方法就够了,呵呵 谢谢你
--------------------------------------------------------
呵呵,firebug还是很不错的啊~
  回复  引用  查看    
#7楼 2008-03-16 13:32 | netguid      
能过提供源码不
  回复  引用  查看    
#8楼 [楼主]2008-03-17 10:32 | 没剑      
@netguid
我写了个简单的demo,你可以在上面文章下找到链接
  回复  引用  查看    
#9楼 2008-03-18 13:03 | netguid1 [未注册用户]
今天调试成功了,非常感谢哈!
  回复  引用  查看    
#10楼 [楼主]2008-03-18 13:54 | 没剑      
--引用--------------------------------------------------
netguid1: 今天调试成功了,非常感谢哈!
--------------------------------------------------------
呵呵,恭喜你啊