Environment Configure

Environment Configuration

Environment เป็นตัวช่วยให้เราสามารถแยกคอนฟิกต่าง ๆ ของ DevelopmentStaging และ Production ออกจากกันได้อย่างอย่างชัดเจน ช่วยให้เราสามารถปรับแก้คอนฟิกในแต่ละ Environment ได้ง่าย มีการแยกไฟล์คอนฟิกออกจากกันอย่างชัดเจนช่วยให้เราหาไฟล์ได้อย่างสะดวก เมื่อมีการแก้ไขไฟล์ใน Environment หนึ่งก็ไม่ต้องกังวลว่าจะไปกระทบกับ Environment อื่น ๆ

Configuration Files

การคอนฟิก Environment ของ AtlasX Web Service ใช้ระบบคอนฟิกเดียวกันกับของ .NET โดยจะแยกคอนฟิกออกเป็น 2 ไฟล์ ได้แก่

  1. appsettings.Development.json คือคอนฟิกสำหรับ Development
  2. appsettings.json คือคอนฟิกสำหรับ Production

เมื่อเรากำลังพัฒนาเว็บเซอร์วิส แล้วคอมไพล์โค้ดด้วยคำสั่ง

dotnet run
# Or
dotnet build
# Or
dotnet publish

Environment จะถูกอ้างอิงไปยังไฟล์ appsettings.Development.json หากต้องการเปลี่ยนการอ้างอิงไปยังไฟล์สำหรับ Production สามารถปรับแก้คอนฟิกได้ที่ไฟล์ Properties/launchSettings.json

หรือหากเราสั่งคอมไพล์โค้ดด้วยคำสั่งข้างต้นและเติม --configuration Release เข้าไปด้วย Environment จะถูกอ้างอิงไปยังไฟล์สำหรับ Production อย่างเช่น

dotnet publish --configuration Release

หากต้องการเพิ่ม Environment สามารถศึกษารายละเอียดเพิ่มเติมได้ที่ Use multiple environments in ASP.NET Core

Configuration Details

ในหัวข้อนี้ จะเป็นการอธิบายรายละเอียดเกี่ยวกับคอนฟิกต่าง ๆ ที่อยู่ใน WebServiceSettings โดยจะมีแค่บางส่วนเท่านั้น ส่วนอื่น ๆ ที่ไม่ได้ถูกอธิบายไว้ในนี้ สามารถดูเพิ่มเติมได้ที่หัวข้อ Services

CorsPolicy

เก็บรายการของ URL ที่อนุญาตให้ Request มายังเว็บเซอร์วิสได้

เว็บเซอร์วิสถูก Request มาจากไซต์ที่เป็น Domain เดียวกัน ถึงแม้ว่าจะเป็นคนละ Application ก็ตาม จะไม่ติด CORS เนื่องจากเว็บบราวเซอร์มองว่าเป็น Domain เดียวกัน แต่ถ้าหากไซต์ที่เรียกมาจากคนละ Domain จะติด CORS โดยปัญหานี้ไม่สามารถแก้ไขที่ฝั่ง Request ได้ (ถึงแก้ได้ก็ไม่ควร) เนื่องจากเป็น Security ที่มากับโมเดิร์นเว็บบราว์เซอร์ ซึ่งเราไม่ควรไป Disabled เพื่อให้สามารถใช้ CORS ที่เครื่องผู้ใช้งาน(ลูกค้า)ทุกเครื่องได้ ดังนั้น Developer ต้องทำการคอนฟิก CORS ที่ฝั่งเว็บเซอร์วิส

ศึกษารายละเอียดเพิ่มเติมเกี่ยวกับการเซตคอนฟิก CORS ได้ที่ Enable Cross-Origin Requests (CORS) in ASP.NET Core

ใครบ้างที่เจอ CORS

ScenariosCORS ErrorDescription
JavaScript with jQuery: http://mysite.co ต้องการ Request ไปยัง https://mysite.co/apiYesถึงแม้ว่า Domain เดียวกัน แต่ http ไม่สามารถเรียก https ได้ เพราะเว็บบราวเซอร์มองว่าเป็นคนละไซต์ ควรทำการ Redirect HTTP ไป HTTPS ให้เรียบร้อย
React App: https://customer.mysite.co ต้องการ Request ไปยัง https://mysite.co/apiYesSub domain ถือว่าเป็นคนละชื่อกับ domain หลัก ให้ทำการเพิ่ม URL ของ Sub domain หรือ Domain หลักใน CorsPolicy ให้เรียบร้อย
Angular App: https://mysite.co/dashboard ต้องการ Request ไปยัง https://mysite.co/apiNoเว็บบราวเซอร์มองว่าเป็น Domain เดียวกัน ไม่ต้องเพิ่ม URL ใน CorsPolicy
ASP.NET: โค้ดฝั่ง Back-end https://customer.mysite.co ต้องการ Request ไปยัง https://mysite.co/api ด้วยโค้ด C#Noเป็นโค้ด Server Side สามารถเรียกได้เลยโดยไม่ติด CORS เพราะไม่ได้ใช้เว็บบราวเซอร์ แต่ต้องทำการ Trust URL ของ https://mysite.co ก่อน Request เนื่องจากเป็น Security ของ .NET
iOS/Android ต้องการ Request ไปยัง https://mysite.co/apiNoNative App สามารถเรียกได้เลยโดยไม่ติด CORS เพราะไม่ได้ใช้เว็บบราวเซอร์
Hybrid App เขียนด้วย Ionic Framework ต้องการ Request ไปยัง https://mysite.co/apiYesเนื่องจาก Engine การทำงานข้างหลังของ Hybrid App เป็นเว็บบราวเซอร์ จึงทำให้ติด CORS ให้ทำการเพิ่ม URL ของ Sub domain ใน CorsPolicy ให้เรียบร้อย ทำการเพิ่ม capacitor://localhost ใน CorsPolicy ให้เรียบร้อย

วิธีอนุญาตให้ทุก URL เรียกเว็บเซอร์ได้

บางครั้งเราต้องการให้ทุก Platform และทุกเว็บไซต์สามารถ Request มายังเว็บเซอร์วิสได้ จึงจำเป็นต้องอนุญาตให้ทุก URL สามารถ Request เว็บเซอร์วิสได้ ดังวิธีการดังต่อไปนี้

  1. เปิดไฟล์ appsettings.Development.json หรือ appsettings.json
{
  ...
  "WebServiceSettings": {
    "CorsPolicy": [
      "http://localhost",
      "https://localhost",
      "https://localhost:5003",
      "http://localhost:5002",
      "https://localhost:5001",
      "http://localhost:5000",
      "http://localhost:4200",
      "https://localhost:4200",
      "capacitor://localhost"
    ],
    ...
  }
  ...
}
  1. แก้ไขคอนฟิกตามตัวอย่างดังนี้
{
  ...
  "WebServiceSettings": {
    "CorsPolicy": [
      "*"
    ],
    ...
  }
  ...
}

หากต้องการอนุญาตทุก Domain ให้ใส่ ["*"] ได้เลย แต่ถ้าต้องการอนุญาตทุก Sub domain ภายใต้ Domain นั้น ๆ สามารถใช้ ["https://*.mysite.co"] ได้เช่นกัน

General

ออกแบบมาเพื่อเอาไว้เก็บคอนฟิกทั่วไปของเว็บเซอร์วิส

AttributesValuesDescription
UserIdFieldUSER_IDชื่อฟิลด์สำหรับอ้างอิงถึง ID ของ USER ในตาราง UM_USER