[C#]關於老舊技術web service的那些事
前言
其實筆者對web form還有web service已經漸漸淡忘了,在多年前雖然有做過,無奈就是都沒有寫下任何筆記,所以今天花了一點時間去了解一下,因為公司的專案大量使用到很多的web service,雖然公司有公司使用web service的方式,但是舊技術總是有很多無奈,所以筆者自己就想嘗試看看是不是有更好的方式,中間也遇到了一些問題,遇到了一些錯誤的部份,那筆者也會紀錄下來給各位看,到底是怎麼排除掉這些問題
動手實作吧
先新增一支web service
首先來先定義一個static物件,來假設是資料庫的操作,然後第一個就是先取得全部的資料
/// <summary>
/// Summary description for Employee
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService] //這行要反註解提供給script呼叫
public class Employee : System.Web.Services.WebService
{
EmployeeDto employeeDto = new EmployeeDto();
[WebMethod]
public void Get()
{
HttpContext.Current.Response.ContentType = "application/json;charset=utf-8";
var json = JsonConvert.SerializeObject(employeeDto.Get());
HttpContext.Current.Response.Write(json); //不要回傳字串,用這種方式以取得真正的json資料
}
}
public class EmployeeDto
{
public static IList<EmployeeDto> Employees { get; set; }
public IList<EmployeeDto> Get()
{
Employees = Employees ?? new List<EmployeeDto>
{
new EmployeeDto {Id=1,Name="anson" },
new EmployeeDto {Id=2,Name="jacky" }
};
return Employees;
}
public int Id { get; set; }
public string Name { get; set; }
}
在呼叫的時候就出錯了,發生了「無法辨認要求格式,因為 URL 未預期地以 /Get 結束。」
果然開始入門就是先踩個坑,這個問題是因為Web.Config需要允許web service可以去使用Get或Post
<webServices>
<protocols>
<add name="HttpGet" />
<add name="HttpPost" />
</protocols>
</webServices>
接下來我有個需求,因為前端的javascript慣性使用的屬性都是小寫,但C#慣性卻是大寫,所以再來修改一下,新增一個方法ConvertToCamelCase來把屬性的json屬性全轉成小寫
private JsonSerializerSettings ConvertToCamelCase() //轉小寫的方法
{
return new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
}
[WebMethod]
public void Get()
{
HttpContext.Current.Response.ContentType = "application/json;charset=utf-8";
var json = JsonConvert.SerializeObject(employeeDto.Get(), ConvertToCamelCase()); //這邊多加上轉小寫的方法
HttpContext.Current.Response.Write(json); //不要回傳字串,用這種方式以取得真正的json資料
}
接下來新增資料的實作吧
[WebMethod]
public void Post(int id,string name)
{
id = employeeDto.Get().Max(x => x.Id) + 1;
EmployeeDto.Employees.Add(new EmployeeDto { Id=id,Name=name});
HttpContext.Current.Response.Write(id);
}
javascript的部份
function add(postData) {
return $.post(`WebService/Employee.asmx/Post`, postData)
}
結論
經過我的研究結果,Post似乎是沒辦法用物件傳值,只能自己定義一個一個參數的方式,雖然現在新開發的專案都會用web api來做開發,但是有很多老專案可能還是使用web service或wcf,如果之後有新發現解決方案,在回來修改,如果有高手知道的話,也再請回覆告知一下。