
Twilio Helper Library สำหรับ ASP.NET (twilio.aspnet) ช่วยให้คุณรวม Twilio SDK อย่างเป็นทางการสำหรับ C# และ. NET เข้ากับแอปพลิเคชัน ASP.NET ของคุณ ห้องสมุดรองรับ ASP.NET MVC บน. NET Framework และ ASP.NET Core
ห้องสมุดนี้ช่วยให้คุณตอบสนองต่อ webhooks เพิ่มไคลเอนต์ Twilio ลงในคอนเทนเนอร์การฉีดพึ่งพาและตรวจสอบความถูกต้องของคำขอ HTTP มาจาก Twilio
ต้องใช้. NET 6.0 หรือใหม่กว่า
เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งแพ็คเกจโดยใช้. NET CLI:
dotnet add package Twilio.AspNet.Coreอีกทางเลือกหนึ่งจาก Package Manager Console หรือ PowerShell นักพัฒนาให้เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งเวอร์ชันล่าสุด:
Install-Package Twilio.AspNet.Coreหรือใช้ Nuget Package Manager สำหรับ Visual Studio หรือหน้าต่าง NUGET สำหรับ Jetbrains Rider จากนั้นค้นหา twilio.aspnet.core และติดตั้งแพ็คเกจ
ต้องใช้. NET 4.6.2 หรือใหม่กว่า
จาก Package Manager Console หรือ PowerShell ผู้พัฒนาให้เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งเวอร์ชันล่าสุด:
Install-Package Twilio.AspNet.Mvcอีกทางเลือกหนึ่งใช้ Nuget Package Manager สำหรับ Visual Studio หรือ Nuget Window สำหรับ Jetbrains Rider จากนั้นค้นหา twilio.aspnet.mvc และติดตั้งแพ็คเกจ
using Twilio . AspNet . Common ;
using Twilio . AspNet . Core ; // or .Mvc for .NET Framework
using Twilio . TwiML ;
public class SmsController : TwilioController
{
// GET: Sms
public TwiMLResult Index ( SmsRequest request )
{
var response = new MessagingResponse ( ) ;
response . Message ( $ "Ahoy { request . From } !" ) ;
return TwiML ( response ) ;
}
} คอนโทรลเลอร์นี้จะจัดการ Webhook SMS รายละเอียดของ SMS ที่เข้ามาจะถูกผูกไว้กับพารามิเตอร์ SmsRequest request โดยการสืบทอดจาก TwilioController คุณจะได้รับการเข้าถึงวิธี TwiML ซึ่งคุณสามารถใช้เพื่อตอบสนองด้วย Twiml
using Twilio . AspNet . Common ;
using Twilio . AspNet . Core ; // or .Mvc for .NET Framework
using Twilio . TwiML ;
public class VoiceController : TwilioController
{
// GET: Voice
public TwiMLResult Index ( VoiceRequest request )
{
var response = new VoiceResponse ( ) ;
response . Say ( $ "Ahoy! Are you from { request . FromCity } ?" ) ;
return TwiML ( response ) ;
}
} คอนโทรลเลอร์นี้จะจัดการกับ webhook เสียง รายละเอียดของการโทรด้วยเสียงที่เข้ามาจะถูกผูกไว้กับพารามิเตอร์ VoiceRequest request โดยการสืบทอดจาก TwilioController คุณจะได้รับการเข้าถึงวิธี TwiML ซึ่งคุณสามารถใช้เพื่อตอบสนองด้วย Twiml
TwiML แทนการสืบทอดจาก TwilioController หากคุณไม่สามารถสืบทอดจากคลาส TwilioController ได้คุณสามารถใช้วิธีการขยาย TwiML ได้
using Microsoft . AspNetCore . Mvc ; // or System.Web.Mvc for .NET Framework
using Twilio . AspNet . Common ;
using Twilio . AspNet . Core ; // or .Mvc for .NET Framework
using Twilio . TwiML ;
public class SmsController : Controller
{
// GET: Sms
public TwiMLResult Index ( SmsRequest request )
{
var response = new MessagingResponse ( ) ;
response . Message ( $ "Ahoy { request . From } !" ) ;
return this . TwiML ( response ) ;
}
} ตัวอย่างนี้เหมือนกับตัวอย่าง SMS WebHook ก่อนหน้า แต่แทนที่จะสืบทอดมาจาก TwilioController SmsController สืบทอดมาจาก ASP.NET MVC จัดหา Controller และใช้สิ่ง this.TwiML เพื่อใช้วิธีการขยาย TwiML
twilio.aspnet.core ยังมีการสนับสนุน API ที่น้อยที่สุด
ตัวอย่างนี้แสดงให้คุณเห็นว่าคุณสามารถส่ง Webhook ได้อย่างไรโดยใช้ HTTP Get and Post
using Microsoft . AspNetCore . Mvc ;
using Twilio . AspNet . Core . MinimalApi ;
using Twilio . TwiML ;
var builder = WebApplication . CreateBuilder ( args ) ;
var app = builder . Build ( ) ;
app . MapGet ( "/sms" , ( [ FromQuery ] string from ) =>
{
var response = new MessagingResponse ( ) ;
response . Message ( $ "Ahoy { from } !" ) ;
return Results . Extensions . TwiML ( response ) ;
} ) ;
app . MapPost ( "/sms" , async ( HttpRequest request ) =>
{
var form = await request . ReadFormAsync ( ) ;
var from = form [ "from" ] ;
response . Message ( $ "Ahoy { from } !" ) ;
return Results . Extensions . TwiML ( response ) ;
} ) ;
app . Run ( ) ; ในคอนโทรลเลอร์ MVC แบบดั้งเดิม SmsRequest , VoiceRequest และวัตถุคำขอที่พิมพ์อื่น ๆ จะถูกผูกไว้ แต่ APIs น้อยที่สุดไม่รองรับการผูกโมเดลเดียวกัน
แต่คุณสามารถผูกพารามิเตอร์แต่ละตัวสำหรับ HTTP ได้รับคำขอโดยใช้แอตทริบิวต์ FromQuery เมื่อคุณไม่ได้ระบุแอตทริบิวต์ FromQuery หลายแหล่งจะได้รับการพิจารณาให้เชื่อมโยงจากนอกจากพารามิเตอร์สตริงแบบสอบถาม สำหรับคำขอโพสต์ HTTP คุณสามารถคว้าแบบฟอร์มแล้วดึงพารามิเตอร์แต่ละตัวโดยดัชนีสตริง
หากต้องการตอบสนองด้วย Twiml ให้ใช้วิธี Results.Extensions.TwiML วิธีการ twiml
Twilio.aspnet มาพร้อมกับหลายคลาสเพื่อช่วยให้คุณผูกข้อมูลจาก webhooks ไปยังวัตถุ. NET ที่พิมพ์อย่างมาก นี่คือรายการของชั้นเรียน:
SmsRequest : เก็บข้อมูลสำหรับคำขอ SMS WebHook ที่เข้ามาSmsStatusCallbackRequest : เก็บข้อมูลสำหรับการติดตามสถานะการส่งมอบของ Twilio SMS หรือ MMS ขาออกStatusCallbackRequest : เก็บข้อมูลสำหรับการติดตามสถานะของการโทร TwilioVoiceRequest : เก็บข้อมูลสำหรับการโทรด้วยเสียงที่เข้ามาหมายเหตุ เฉพาะคอนโทรลเลอร์ MVC และหน้ามีดโกนที่รองรับโมเดลที่มีผลผูกพันกับวัตถุ. NET ที่พิมพ์ ใน APIs ขั้นต่ำและสถานการณ์อื่น ๆ คุณจะต้องเขียนโค้ดเพื่อแยกพารามิเตอร์ด้วยตัวคุณเอง
ตัวอย่างต่อไปนี้แสดงวิธียอมรับ SMS ขาเข้าตอบกลับและติดตามสถานะของการตอบสนอง SMS
using Twilio . AspNet . Common ;
using Twilio . AspNet . Core ; // or .Mvc for .NET Framework
using Twilio . TwiML ;
public class SmsController : TwilioController
{
private readonly ILogger < SmsController > logger ;
public SmsController ( ILogger < SmsController > logger )
{
this . logger = logger ;
}
public TwiMLResult Index ( SmsRequest request )
{
var messagingResponse = new MessagingResponse ( ) ;
messagingResponse . Message (
body : $ "Ahoy { request . From } !" ,
action : new Uri ( "/Sms/StatusCallback" ) ,
method : Twilio . Http . HttpMethod . Post
) ;
return TwiML ( messagingResponse ) ;
}
public void StatusCallback ( SmsStatusCallbackRequest request )
{
logger . LogInformation ( "SMS Status: {Status}" , request . MessageStatus ) ;
}
} ดังที่แสดงในตัวอย่างด้านบนคุณสามารถเพิ่ม SmsRequest เป็นพารามิเตอร์และ MVC จะผูกวัตถุให้คุณ จากนั้นรหัสจะตอบกลับด้วย SMS ด้วยพารามิเตอร์ status และ method เมื่อสถานะของการเปลี่ยนแปลง SMS Twilio จะส่งคำขอโพสต์ HTTP ไปยังการดำเนินการ StatusCallback คุณสามารถเพิ่ม SmsStatusCallbackRequest เป็นพารามิเตอร์และ MVC จะผูกวัตถุให้คุณ
ใน ASP.NET CORE คุณสามารถเพิ่มไคลเอนต์ Twilio REST API ลงในบริการของ ASP.NET Core โดยใช้วิธี .AddTwilioClient เช่นนี้:
using Twilio . AspNet . Core ;
var builder = WebApplication . CreateBuilder ( args ) ;
builder . Services . AddTwilioClient ( ) ตอนนี้คุณสามารถขอ ITwilioRestClient และ TwilioRestClient ผ่านการฉีดพึ่งพา
คุณสามารถกำหนดค่าไคลเอนต์ Twilio โดยใช้การกำหนดค่าต่อไปนี้:
{
"Twilio" : {
"AuthToken" : " [YOUR_AUTH_TOKEN] " ,
"Client" : {
"AccountSid" : " [YOUR_ACCOUNT_SID] " ,
"AuthToken" : " [YOUR_AUTH_TOKEN] " ,
"ApiKeySid" : " [YOUR_API_KEY_SID] " ,
"ApiKeySecret" : " [YOUR_API_KEY_SECRET] " ,
"CredentialType" : " [Unspecified|AuthToken|ApiKey] " ,
"Region" : null ,
"Edge" : null ,
"LogLevel" : null
}
}
}บันทึกสองสามข้อ:
Twilio:Client:AuthToken Falls กลับมาที่ Twilio:AuthToken คุณจะต้องกำหนดค่าหนึ่งในนั้นเท่านั้นTwilio:Client:CredentialType มีค่าที่ถูกต้องดังต่อไปนี้: Unspecified , AuthToken หรือ ApiKeyTwilio:Client:CredentialType เป็นตัวเลือกและค่าเริ่มต้นที่จะ Unspecified หาก Unspecified ไม่ว่าคุณจะกำหนดค่าคีย์ API หรือโทเค็นการรับรองความถูกต้องจะถูกตรวจพบหากคุณไม่ต้องการกำหนดค่าไคลเอนต์ Twilio โดยใช้การกำหนดค่า. NET คุณสามารถทำได้ด้วยตนเอง:
using Twilio . AspNet . Core ;
var builder = WebApplication . CreateBuilder ( args ) ;
builder . Services
. AddTwilioClient ( ( serviceProvider , options ) =>
{
options . AccountSid = "[YOUR_ACCOUNT_SID]" ;
options . AuthToken = "[YOUR_AUTH_TOKEN]" ;
options . ApiKeySid = "[YOUR_API_KEY_SID]" ;
options . ApiKeySecret = "[YOUR_API_KEY_SECRET]" ;
options . Edge = null ;
options . Region = null ;
options . LogLevel = null ;
options . CredentialType = CredentialType . Unspecified ;
} ) ;คำเตือน อย่าใช้รหัส โทเค็น Auth หรือ API Key Secret เป็นรหัสและไม่ตรวจสอบในการควบคุมแหล่งที่มา เราขอแนะนำให้ใช้ Secrets Manager เพื่อการพัฒนาในท้องถิ่น หรือคุณสามารถใช้ตัวแปรสภาพแวดล้อมบริการห้องนิรภัยหรือเทคนิคที่ปลอดภัยอื่น ๆ
โดยค่าเริ่มต้นเมื่อคุณโทร .AddTwilioClient โรงงานไคลเอนต์ HTTP จะถูกกำหนดค่าที่ใช้เพื่อให้ HttpClient ไปยังไคลเอนต์ Twilio REST หากคุณต้องการปรับแต่งไคลเอนต์ HTTP นี้คุณสามารถทำได้โดยการเอาชนะโรงงานไคลเอนต์ "Twilio" HTTP หลังจากเรียกใช้ .AddTwilioClient :
builder . Services . AddTwilioClient ( ) ;
builder . Services . AddHttpClient ( "Twilio" )
. ConfigureHttpClient ( client =>
{
client . BaseAddress = new Uri ( "YOUR_PROXY_ADDRESS" ) ;
} )
. ConfigurePrimaryHttpMessageHandler ( ( ) => new HttpClientHandler
{
// same options as the Twilio C# SDK
AllowAutoRedirect = false
} ) ;Webhooks ต้องการจุดสิ้นสุดของคุณในที่สาธารณะ แต่สิ่งนี้ยังแนะนำความเสี่ยงที่นักแสดงที่ไม่ดีสามารถหา URL webhook ของคุณและพยายามที่จะใช้ในทางที่ผิด
โชคดีที่คุณสามารถตรวจสอบได้ว่าคำขอ HTTP มีต้นกำเนิดมาจาก Twilio ไลบรารี Twilio.AspNet จัดเตรียมแอตทริบิวต์ที่จะตรวจสอบความถูกต้องของคำขอสำหรับคุณใน MVC การใช้งานแตกต่างกันระหว่าง Twilio.AspNet.Core และ Twilio.AspNet.Mvc ไลบรารี
เพิ่มวิธี .AddTwilioRequestValidation ในการเริ่มต้น:
using Twilio . AspNet . Core ;
var builder = WebApplication . CreateBuilder ( args ) ;
builder . Services . AddTwilioRequestValidation ( ) ;จากนั้นกำหนดค่าการตรวจสอบคำขอ:
{
"Twilio" : {
"AuthToken" : " [YOUR_AUTH_TOKEN] " ,
"RequestValidation" : {
"AuthToken" : " [YOUR_AUTH_TOKEN] " ,
"AllowLocal" : false ,
"BaseUrlOverride" : " https://??????.ngrok.io "
}
}
}โน้ตสองสามข้อเกี่ยวกับการกำหนดค่า:
Twilio:RequestValidation:AuthToken Falls กลับมาที่ Twilio:AuthToken คุณจะต้องกำหนดค่าหนึ่งในนั้นเท่านั้นAllowLocal จะข้ามการตรวจสอบความถูกต้องเมื่อคำขอ HTTP เกิดขึ้นจาก LocalHostBaseUrlOverride ในกรณีที่แอปของคุณอยู่เบื้องหลังพร็อกซีย้อนกลับหรืออุโมงค์เช่น Ngrok เส้นทางของคำขอปัจจุบันจะถูกผนวกเข้ากับ BaseUrlOverride สำหรับการตรวจสอบความถูกต้องของคำขอข้อมูล แทนการกำหนดค่า
BaseUrlOverrideคุณสามารถใช้มิดเดิลแวร์ส่วนหัวที่ส่งต่อเพื่อตั้งค่าโครงการที่ถูกต้องพอร์ตโฮสต์ ฯลฯ ในคำขอ HTTP ปัจจุบัน
using Microsoft . AspNetCore . HttpOverrides ;
using Twilio . AspNet . Core ;
var builder = WebApplication . CreateBuilder ( args ) ;
builder . Services . AddTwilioRequestValidation ( ) ;
builder . Services . Configure < ForwardedHeadersOptions > ( options => options . ForwardedHeaders = ForwardedHeaders . All ) ;
// more service configuration
var app = builder . Build ( ) ;
app . UseForwardedHeaders ( ) ;
// more request pipeline configuration
app . Run ( ) ; เป็นผลให้คุณไม่จำเป็นต้องกำหนดค่า BaseUrlOverride เมื่อใดก็ตามที่คุณรีสตาร์ท NGROK หรือเปลี่ยน URL พร็อกซีย้อนกลับ ทำตามคำแนะนำของ Microsoft เพื่อกำหนดค่ามิดเดิลแวร์ส่วนหัวที่ส่งต่ออย่างปลอดภัย
นอกจากนี้คุณยังสามารถกำหนดค่าการตรวจสอบความถูกต้องของคำขอด้วยตนเอง:
using Twilio . AspNet . Core ;
var builder = WebApplication . CreateBuilder ( args ) ;
builder . Services
. AddTwilioRequestValidation ( ( serviceProvider , options ) =>
{
options . AuthToken = "[YOUR_AUTH_TOKEN]" ;
options . AllowLocal = false ;
options . BaseUrlOverride = "https://??????.ngrok.io" ;
} ) ;คำเตือน อย่าใช้รหัส โทเค็นการรับรองความถูกต้อง ของคุณเป็นรหัสและไม่ตรวจสอบพวกเขาในการควบคุมแหล่งที่มา เราขอแนะนำให้ใช้ Secrets Manager เพื่อการพัฒนาในท้องถิ่น หรือคุณสามารถใช้ตัวแปรสภาพแวดล้อมบริการห้องนิรภัยหรือเทคนิคที่ปลอดภัยอื่น ๆ
เมื่อมีการกำหนดค่าการตรวจสอบความถูกต้องของคำขอแล้วคุณสามารถใช้แอตทริบิวต์ [ValidateRequest] ใน MVC คุณสามารถใช้แอตทริบิวต์ทั่วโลกไปยังพื้นที่ MVC คอนโทรลเลอร์และการกระทำ นี่คือตัวอย่างที่แอตทริบิวต์ถูกนำไปใช้กับการดำเนินการ Index :
using Twilio . AspNet . Common ;
using Twilio . AspNet . Core ;
using Twilio . TwiML ;
public class SmsController : TwilioController
{
[ ValidateRequest ]
public TwiMLResult Index ( SmsRequest request )
{
var response = new MessagingResponse ( ) ;
response . Message ( "Ahoy!" ) ;
return TwiML ( response ) ;
}
} .NET 7 แนะนำแนวคิดของตัวกรองปลายทางซึ่งคุณสามารถนำไปใช้กับจุดสิ้นสุดหลักของ ASP.NET ไลบรารีผู้ช่วยสำหรับ ASP.NET CORE เพิ่มตัวกรองปลายทางเพื่อตรวจสอบคำขอ TWILIO ที่เรียกว่า ValidateTwilioRequestFilter
คุณสามารถเพิ่มตัวกรองนี้ไปยังกลุ่มจุดปลายหรือกลุ่มจุดปลายได้โดยใช้วิธี ValidateTwilioRequest :
// add filter to endpoint
app . MapPost ( "/sms" , ( ) => .. . )
. ValidateTwilioRequest ( ) ;
// add filter to endpoint group
var twilioGroup = app . MapGroup ( "/twilio" ) ;
twilioGroup . ValidateTwilioRequest ( ) ;
twilioGroup . MapPost ( "/sms" , ( ) => .. . ) ;
twilioGroup . MapPost ( "/voice" , ( ) => .. . ) ;หรือคุณสามารถเพิ่มตัวกรองปลายทางด้วยตัวเอง:
app . MapPost ( "/sms" , ( ) => .. . )
. AddEndpointFilter < ValidateTwilioRequestFilter > ( ) ; เมื่อคุณไม่สามารถใช้ตัวกรอง [ValidateRequest] หรือ ValidateTwilioRequestFilter คุณสามารถใช้ ValidateTwilioRequestMiddleware แทน คุณสามารถเพิ่ม Add ValidateTwilioRequestFilter ได้เช่นนี้:
app . UseTwilioRequestValidation ( ) ;
// or the equivalent: app.UseMiddleware<ValidateTwilioRequestMiddleware>(); มิดเดิลแวร์นี้จะทำการตรวจสอบความถูกต้องสำหรับคำขอทั้งหมด หากคุณไม่ต้องการใช้การตรวจสอบความถูกต้องกับคำขอทั้งหมดคุณสามารถใช้ app.UseWhen() เพื่อเรียกใช้มิดเดิลแวร์อย่างมีเงื่อนไข
นี่คือตัวอย่างของวิธีการตรวจสอบคำขอที่เริ่มต้นด้วย Path /Twilio-Media เพื่อปกป้องไฟล์สื่อที่มีเพียงพร็อกซี Twilio เท่านั้นที่สามารถเข้าถึงได้:
using System . Net ;
using Microsoft . Extensions . FileProviders ;
using Microsoft . Extensions . Options ;
using Twilio . AspNet . Core ;
var builder = WebApplication . CreateBuilder ( args ) ;
builder . Services . AddTwilioRequestValidation ( ) ;
var app = builder . Build ( ) ;
app . UseWhen (
context => context . Request . Path . StartsWithSegments ( "/twilio-media" , StringComparison . OrdinalIgnoreCase ) ,
app => app . UseTwilioRequestValidation ( )
) ;
app . UseStaticFiles ( new StaticFileOptions
{
FileProvider = new PhysicalFileProvider ( Path . Combine ( builder . Environment . ContentRootPath , "TwilioMedia" ) ) ,
RequestPath = "/twilio-media"
} ) ;
app . Run ( ) ; ใน web.config ของคุณคุณสามารถกำหนดค่าการตรวจสอบความถูกต้องของคำขอดังที่แสดงด้านล่าง:
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< configuration >
< configSections >
< sectionGroup name = " twilio " type = " Twilio.AspNet.Mvc.TwilioSectionGroup,Twilio.AspNet.Mvc " >
< section name = " requestValidation " type = " Twilio.AspNet.Mvc.RequestValidationConfigurationSection,Twilio.AspNet.Mvc " />
</ sectionGroup >
</ configSections >
< twilio >
< requestValidation
authToken = " [YOUR_AUTH_TOKEN] "
baseUrlOverride = " https://??????.ngrok.io "
allowLocal = " false "
/>
</ twilio >
</ configuration >นอกจากนี้คุณยังสามารถกำหนดค่าการตรวจสอบความถูกต้องของคำขอโดยใช้การตั้งค่าแอป:
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< configuration >
< appSettings >
< add key = " twilio:requestValidation:authToken " value = " [YOUR_AUTH_TOKEN] " />
< add key = " twilio:requestValidation:baseUrlOverride " value = " https://??????.ngrok.io " />
< add key = " twilio:requestValidation:allowLocal " value = " false " />
</ appSettings >
</ configuration > หากคุณกำหนดค่าการตรวจสอบความถูกต้องของคำขอโดยใช้ทั้งสองวิธีการตั้งค่าแอปจะเขียนทับองค์ประกอบการกำหนดค่า twilio/requestValidation
โน้ตสองสามข้อเกี่ยวกับการกำหนดค่า:
allowLocal จะข้ามการตรวจสอบความถูกต้องเมื่อคำขอ HTTP เกิดขึ้นจาก LocalHostbaseUrlOverride ในกรณีที่คุณอยู่ด้านหน้าของพร็อกซีย้อนกลับหรืออุโมงค์เช่น Ngrok เส้นทางของคำขอปัจจุบันจะถูกผนวกเข้ากับ baseUrlOverride สำหรับการตรวจสอบความถูกต้องของคำขอคำเตือน อย่าใช้รหัส โทเค็นการรับรองความถูกต้อง ของคุณเป็นรหัสและไม่ตรวจสอบพวกเขาในการควบคุมแหล่งที่มา ใช้
UserSecretsConfigBuilderสำหรับการพัฒนาในท้องถิ่นหรือหนึ่งในผู้สร้างการกำหนดค่าอื่น ๆ หรือคุณควรเข้ารหัสส่วนการกำหนดค่าที่มีความลับเช่นโทเค็น Auth
ตอนนี้การตรวจสอบความถูกต้องของคำขอได้รับการกำหนดค่าให้ใช้แอตทริบิวต์ [ValidateRequest] คุณสามารถใช้แอตทริบิวต์ทั่วโลกไปยังพื้นที่ MVC คอนโทรลเลอร์และการกระทำ นี่คือตัวอย่างที่แอตทริบิวต์ถูกนำไปใช้กับการดำเนินการ Index :
using Twilio . AspNet . Common ;
using Twilio . AspNet . Mvc ;
using Twilio . TwiML ;
public class SmsController : TwilioController
{
[ ValidateRequest ]
public TwiMLResult Index ( SmsRequest request )
{
var response = new MessagingResponse ( ) ;
response . Message ( "Ahoy!" ) ;
return TwiML ( response ) ;
}
} แอตทริบิวต์ [ValidateRequest] ใช้ได้เฉพาะกับ MVC เท่านั้น หากคุณต้องการตรวจสอบคำขอนอก MVC คุณสามารถใช้คลาส RequestValidationHelper ที่จัดทำโดย Twilio.AspNet อีกวิธีหนึ่งคือคลาส RequestValidator จาก Twilio SDK ยังสามารถช่วยคุณได้
นี่คือตัวอย่าง API ขั้นต่ำที่ตรวจสอบคำขอที่เข้ามาจาก Twilio:
using System . Net ;
using Microsoft . Extensions . Options ;
using Twilio . AspNet . Core ;
using Twilio . AspNet . Core . MinimalApi ;
using Twilio . TwiML ;
var builder = WebApplication . CreateBuilder ( args ) ;
// adds TwilioRequestValidationOptions
builder . Services . AddTwilioRequestValidation ( ) ;
var app = builder . Build ( ) ;
app . MapPost ( "/sms" , ( HttpContext httpContext ) =>
{
if ( IsValidTwilioRequest ( httpContext ) == false )
return Results . StatusCode ( ( int ) HttpStatusCode . Forbidden ) ;
var messagingResponse = new MessagingResponse ( ) ;
messagingResponse . Message ( "Ahoy!" ) ;
return Results . Extensions . TwiML ( messagingResponse ) ;
} ) ;
app . Run ( ) ;
bool IsValidTwilioRequest ( HttpContext httpContext )
{
var options = httpContext . RequestServices
. GetService < IOptions < TwilioRequestValidationOptions > > ( )
? . Value ?? throw new Exception ( "TwilioRequestValidationOptions missing." ) ;
string ? urlOverride = null ;
if ( options . BaseUrlOverride is not null )
{
var request = httpContext . Request ;
urlOverride = $ " { options . BaseUrlOverride . TrimEnd ( '/' ) } { request . Path } { request . QueryString } " ;
}
return RequestValidationHelper . IsValidRequest ( httpContext , options . AuthToken , urlOverride , options . AllowLocal ) ;
} AddTwilioRequestValidation เพิ่ม TwilioRequestValidationOptions ซึ่งโดยปกติจะใช้สำหรับแอตทริบิวต์ [ValidateRequest] แต่ในตัวอย่างนี้มันถูกใช้เพื่อดึงการกำหนดค่าการตรวจสอบความถูกต้องของคำขอด้วยตัวเอง จากนั้นภายในจุดสิ้นสุดของ /SMS จะใช้วิธีการ IsValidTwilioRequest เพื่อตรวจสอบความถูกต้องของคำขอ IsValidTwilioRequest ดึงตัวเลือกการตรวจสอบความถูกต้องของคำขอจาก DI และดำเนินการตรรกะเดียวกับ [ValidateRequest] จะทำสำหรับคำขอ MVC หากคำขอไม่ถูกต้องรหัสสถานะ HTTP 403 จะถูกส่งคืนมิฉะนั้น twiml บางตัวจะถูกส่งกลับไปยัง Twilio