*** อ่านไป ทำไป บันทึกไป แก้ไขไป ***

การทำ Web Service ผ่านใต้สภาพแวดล้อมของ Microsoft เท่าที่พบในปัจจุบันมีอยู่ 2 แบบ คือ WCF และ Web API 2
ลองอ่านต่อที่นี่ http://msdn.microsoft.com/en-us/library/jj823172(v=vs.110).aspx

อ่านไปก็ไม่เข้าใจอะไรมาก แต่สนใจตรง Keyword ที่ว่าใช้ Web API จะเป็น REST-style ซึ่งจะได้ยินบ่อย การใช้ Protocol พื้นฐาน และ รูปแบบข้อมูลเป็นแบบง่ายๆ คือ HTTP, JSON, XML เป็นต้น ทั้งนี้ WCF ก็สามารถให้ข้อมูลแบบ JSON และ XML เช่นกัน สุดท้ายลองเลือกใช้ Web API ไปก่อน

Use WCF to create reliable, secure web services that accessible over a variety of transports. Use ASP.NET Web API to create HTTP-based services that are accessible from a wide variety of clients. Use ASP.NET Web API if you are creating and designing new REST-style services. Although WCF provides some support for writing REST-style services, the support for REST in ASP.NET Web API is more complete and all future REST feature improvements will be made in ASP.NET Web API. If you have an existing WCF service and you want to expose additional REST endpoints, use WCF and the WebHttpBinding.

 

ก่อนเริ่มทำ Web API ก็ศึกษาจากการอ่านจากเว็บ

  1. http://www.webdevelopmenthelp.net/2013/09/asp-web-api-service.html
  2. http://blog.ideaz.net/2014/02/how-to-create-json-restful-web-service.html
  3. http://www.codeproject.com/Articles/720912/Build-and-deploy-ASP-NET-Web-API-service-layer-a

 

ขั้นตอนการทำงาน+บันทึกพิเศษเพิ่มเติม

  1. ใช้ Visual Studio Pro 2013
    หากเกิด Error ในกระบวนการสร้าง Solution/Project เช่น
    > This template attempted to load component assembly NuGet.VisualStudio.Interop, Versioin………….
    > The system canont find the file specified (Exception form HRESULT: 0x80070002)
    พยายามหาวิธีแก้ไขอยู่นานแต่ไม่เจอ โดยจะเจอว่าเป็นเพราะมี Visual Studio หลาย Version ในเครื่อง…ประเด็นนี้ก็ไม่จริงทั้งหมด แก้ไขง่ายสุดคือ Re-Install
  2. Config ให้ลองรับข้อมูลแบบ JSON
    == App_Start/WebApiConfig.cs ==
    config.Formatters.Remove(config.Formatters.XmlFormatter);
    config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue(“application/json”));
  3. กรณีที่ใช้ EDM ในการเชื่อมต่อกับฐานข้อมูล และมีการกำหนดค่า Reference ระหว่าง Entities ต้องกำหนดค่านี้ไว้ด้วย
    == App_Start/WebApiConfig.cs ==
    config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
  4. ในกรณีที่มีการเรียกใช้ WebSerivce ข้าม Domain ไม่ว่าจะเป็น ชื่อ URL, http/https หรือ Port จะไม่สามารถร้องขอข้อมูล JSON ได้ เนื่องจากมี Same-origin policy ควบคุมอยู่ ดูวิธีการปรับแต่งเพื่อให้รองรับงานลักษณะนี้ที่หัวข้อ CROS
    'Access-Control-Allow-Origin'

 

Cross-Origin Resource Sharing (CORS)

สำหรับ ASP.NET มีรายละเอียดที่  http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

the same-origin policy does not prevent the browser from sending the request. Instead, it prevents the application from seeing the response.

สำหรับ Visual Studio 2013 ให้เปิดหน้าต่าง Package Manager Console โดยเลือกไปที่เมนู Tools > NuGet Package Manager สำหรับบางรุ่นอาจอยู่ที่ Tools > Package Manager Console พิมพ์คำสั่งติดตั้ง Cors Package และไฟล์อื่นๆ ที่จำเป็น ด้วยคำสั่ง

Install-Package Microsoft.AspNet.WebApi.Cors

Install WebApi Cors

 

หลังจากติดตั้งเสร็จ ให้ Restart Visual Studio หลังจากนั้นเปิด Web Service ที่ต้องการให้รองรับ Cors

เปิดไฟล์ App_Start/WebApiConfig.cs แล้วเพิ่มคำสั่งต่อไปนี้ เพื่อใช้งาน

config.EnableCors();

เปิดไฟล์ Controller ที่จะให้บริการข้าม Domain แล้วเพิ่มคำสั่งต่อไปนี้ใน Controller ที่จะให้บริการ

using System.Web.Http.Cors;

[EnableCors(“http://lcwin209.phuket.psu.ac.th:81”, “*”, “*”)] // หรือ [EnableCors(origins: “http://lcwin209.phuket.psu.ac.th:81”, headers: “*”, methods: “*”)] // หรือ [EnableCors(origins: “*”, headers: “*”, methods: “*”)] // หรือ [EnableCors(“http://lcwin209.phuket.psu.ac.th:81”, “*”, “GET”)] public class TestController: ApiController
{

}

หรือในกรณีที่ต้องการกำหนดค่าให้เป็นผลกับทุกๆ Controller ให้กำหนดที่ App_Start/WebApiConfig.cs โดยปรับส่วนการ EnableCors() ดังตัวอย่างนี้

config.EnableCors(new EnableCorsAttribute(“http://lcwin209.phuket.psu.ac.th:81”, “*”, “GET, POST, PUT”));

 

การคิดเชิงรุก คืออะไร?
เมื่อคิดจะศึกษา PHP Framework ดูบ้าง

Leave a Comment