[C#] WebService 使用 JSON 格式傳遞筆記 + JQuery 測試

2012-10-08

 

因為一些因素,必須改寫WebService,很傳統,但是很多公司還在用..

因為XML 的關係,不想讓他傳遞資料的時候過度肥大,所以我必須要盡量乾淨的JSON..

於是開始我的改寫旅程..

 

首先,網路上好多好多好多文件,可能因為狀況不同,測試過許多也讓我搞混很多次..

最後有找到答案..筆記一下..

 

首先我開了三個不同的WebMethod 來測試三種不同的輸出..

GetUserInfoString –取得字串

GetOneUserInfo - 取得一個物件

GetUsers - 取得物件們

using System.Collections.Generic;
using System.Web.Script.Services;
using System.Web.Services;

namespace JsonServiceSample
{

public class User
{
public string Name { get; set; }
public int Age { get; set; }
}


[WebService(Namespace = "", Description = "For Donma Test")]
[System.ComponentModel.ToolboxItem(false)]
[ScriptService]
public class Service1 : WebService
{


[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string GetUserInfoString(string name, int age)
{
return name + "," + age;
}


[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public User GetOneUserInfo(string name, int age)
{
return (new User { Name = name, Age = age });

}


[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public User[] GetUsers(string name, int age)
{
List<User> res = new List<User>();
res.Add(new User { Name = name + "1", Age = age });
res.Add(new User { Name = name + "2", Age = age });

return res.ToArray();
}


}

}


 


如這篇  [C#] Web Service 移除 xmlns  我先移除xml namespace


再來一個重點,在每一個Method 上方我都會加上


[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]



因為基於有時候我會需要使用GET 方式傳遞 所以我在Web Config 中加入


在system.web 中加入


<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost" />
<add name="Documentation" />
</protocols>
</webServices>

Web.Config 全文:


<?xml version="1.0"?>

<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->

<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="JsonServiceSample.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<httpHandlers>
</httpHandlers>

<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost" />
<add name="Documentation" />
</protocols>
</webServices>
</system.web>

<applicationSettings>
<JsonServiceSample.Properties.Settings>
<setting name="JsonServiceSample_JTestService_Service1" serializeAs="String">
<value>http://localhost:5403/Service1.asmx</value>
</setting>
</JsonServiceSample.Properties.Settings>
</applicationSettings>
</configuration>

這樣試跑一下


2012-10-08_182117


奇怪為什麼不是JSON ,別緊張…我們繼續使用 JQuery 來呼叫看看..


JQuery Code :


 


<input type="button" id="ipt1" value="test" />

<script type="text/javascript">
   1:  
   2:        function GetInfo() {
   3:            var $res;
   4:            $.ajax({
   5:                type: "POST",
   6:                url: "Service1.asmx/GetOneUserInfo",
   7:                contentType: "application/json; charset=utf-8",
   8:                async: false,
   9:                cache: false,
  10:                dataType: 'json',
  11:                data: "{name:'當麻',age:29}",
  12:                success: function (data) {
  13:                    if (data.hasOwnProperty("d")) {
  14:                        $res = data.d;
  15:                    }
  16:                    else
  17:                        $res = data;
  18:                }
  19:            });
  20:            return $res;
  21:        }
  22:        
  23:  
  24:        $('#ipt1').click(function () {
  25:            var res = GetInfo();
  26:            alert(res.Name);
  27:        });
  28:        
  29:    
</script>



按鈕按下去之後 我讓他呼叫 GetOneUserInfo 這 method


並且使用POST


看下結果..


 


2012-10-08_183302


 


恩恩..的確是JSON, 但是多了一個 d  跟 __type 基本上  __type 不要去動他是不影響,但是  d 這東西必須得處理..


所以我參考這一篇 : http://encosia.com/never-worry-about-asp-net-ajaxs-d-again/


進行改寫..實測過上面三種不同的回傳值..都 OK~~


這樣對於傳統的 WebService Reference 呼叫  WebService 不會有影響..


也可以透過JQuery 呼叫傳遞透過JSON…


筆記一下..給需要的人…


當麻許的超技八 2014 | Donma Hsu Design.