[C#]關於老舊技術web service的那些事

[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,如果之後有新發現解決方案,在回來修改,如果有高手知道的話,也再請回覆告知一下。