用Jquery访问WebService并返回Json的代码

  在我们的应用中一般会是这样的,使用了jquery作为客户端框架,ajax请求也通常返回html或者json。html这里就不讨论了。返回json一般都是搞一个handler.ashx来处理请求,拼凑字符串来返回json。从而放弃了ws,因为ws返回的是xml,使用起来不方便。

  所以我觉着比较完美的解决方法是让ws返回json而且不用asp.net ajax的客户端框是比较理想的解决方法。

  通过观测发现asp.net ajax的客户端框架请求webservice的时候返回的是json,为什么webservice没有返回xml而返回了json呢?抓包分析到,关键在request的headers中 “Content-Type: application/json;utf-8” ,因此webservice就使用了json的序列化,应该是“System.Web.Script.Serialization.JavaScriptSerializer”这个类完成的工作,通过web.config的配置,把*.asmx交给了System.Web.Extensions.Dll。也就是这里还是用了asp.net ajax,不过是用的服务端部分,我这里直接用的asp.net 3.5

  以上都是在啰嗦,具体的方法很简单,看例子

  ws1.asmx

  

复制代码 代码如下:

  using System;

  using System.Collections;

  using System.ComponentModel;

  using System.Data;

  using System.Linq;

  using System.Web;

  using System.Web.Services;

  using System.Web.Services.Protocols;

  using System.Xml.Linq;

  namespace test2

  {

  /// <summary>

  /// Summary description for WS1

  /// </summary>

  [WebService(Namespace = "http://onewww.org/")]

  [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

  [ToolboxItem(false)]

  [System.Web.Script.Services.ScriptService]

  public class WS1 : System.Web.Services.WebService

  {

  [WebMethod]

  public string HelloWorld()

  {

  return "Hello World";

  }

  [WebMethod]

  public TestUser CreateUser(string name,int age)

  {

  return new TestUser { Name = name, Age = age };

  }

  }

  public class TestUser

  {

  public string Name { get; set; }

  public int Age { get; set; }

  }

  }

  test.html

  

复制代码 代码如下:

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  <html xmlns="http://www.w3.org/1999/xhtml" >

  <head runat="server">

  <title>Untitled Page</title>

  <script src="jquery-1.2.2.js" type="text/javascript"></script>

  </head>

  <body>

  <input type="button" onclick="requestHelloWorld();" value="请求HelloWorld" />

  <input type="button" onclick="requestCreateUser();" value="请求CreateUser" />

  <script type="text/javascript">

  function requestHelloWorld(){

  WebService('ws1.asmx/HelloWorld',function(obj){alert(obj);});

  }

  function requestCreateUser(){

  WebService('ws1.asmx/CreateUser',function(obj){alert(obj.Name);},'{name:"林子",age:25}');

  }

  function WebService(url,callback,pars){

  $.ajax({

  data:pars,

  url: url,

  type: "POST",

  contentType: "application/json;utf-8",

  dataType:'json',

  cache: false,

  success: function(json){

  callback(json.d);

  },

  error:function(xml,status){

  if(status=='error'){

  try{

  var json = eval('(' + xml.responseText + ')');

  alert(json.Message+'\n'+json.StackTrace);

  }catch(e){}

  }else{

  alert(status);

  }

  },

  beforeSend:function(xml){

  if(!pars) xml.setRequestHeader("Content-Type", "application/json;utf-8")

  }

  });

  }

  </script>

  </body>

  </html>

  web.config为vs2008在.net 3.5状态下创建的默认的 也有很重要的作用 这里贴出来

  

复制代码 代码如下:

  <?xml version="1.0"?>

  <configuration>

  <configSections>

  <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">

  <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">

  <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>

  <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">

  <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>

  <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>

  <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>

  <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>

  </sectionGroup>

  </sectionGroup>

  </sectionGroup>

  </configSections>

  <appSettings/>

  <connectionStrings/>

  <system.web>

  <!--

  Set compilation debug="true" to insert debugging

  symbols into the compiled page. Because this

  affects performance, set this value to true only

  during development.

  -->

  <compilation debug="true">

  <assemblies>

  <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>

  <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>

  <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

  <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>

  </assemblies>

  </compilation>

  <!--

  The <authentication> section enables configuration

  of the security authentication mode used by

  ASP.NET to identify an incoming user.

  -->

  <authentication mode="None"/>

  <!--

  The <customErrors> section enables configuration

  of what to do if/when an unhandled error occurs

  during the execution of a request. Specifically,

  it enables developers to configure html error pages

  to be displayed in place of a error stack trace.

  <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">

  <error statusCode="403" redirect="NoAccess.htm" />

  <error statusCode="404" redirect="FileNotFound.htm" />

  </customErrors>

  -->

  <pages>

  <controls>

  <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

  <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

  </controls>

  </pages>

  <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"/>

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

  <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>

  </httpHandlers>

  <httpModules>

  <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

  </httpModules>

  </system.web>

  <system.codedom>

  <compilers>

  <compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

  <providerOption name="CompilerVersion" value="v3.5"/>

  <providerOption name="WarnAsError" value="false"/>

  </compiler>

  </compilers>

  </system.codedom>

  <!--

  The system.webServer section is required for running ASP.NET AJAX under Internet

  Information Services 7.0. It is not necessary for previous version of IIS.

  -->

  <system.webServer>

  <validation validateIntegratedModeConfiguration="false"/>

  <modules>

  <remove name="ScriptModule"/>

  <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

  </modules>

  <handlers>

  <remove name="WebServiceHandlerFactory-Integrated"/>

  <remove name="ScriptHandlerFactory"/>

  <remove name="ScriptHandlerFactoryAppServices"/>

  <remove name="ScriptResource"/>

  <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

  <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

  <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

  </handlers>

  </system.webServer>

  <runtime>

  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

  <dependentAssembly>

  <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>

  <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>

  </dependentAssembly>

  <dependentAssembly>

  <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>

  <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>

  </dependentAssembly>

  </assemblyBinding>

  </runtime>

  </configuration>

  用javascript直接访问asp.net的webservice,方法类似,自己构建ajax请求而已,注意的就是设置header,剩下的asp.net 3.0以上版本会自动序列化为json

  代码下载

  http://xiazai.glzy8.com/yuanma/asp.net/jquery_webservices_json.zip