
ASP.NET (Twilio.aspnet) 용 Twilio 헬퍼 라이브러리를 사용하면 공식 Twilio SDK를 C# 및 .NET를 ASP.NET 응용 프로그램에 통합하는 데 도움이됩니다. 이 라이브러리는 .NET Framework 및 ASP.NET Core에서 ASP.NET MVC를 지원합니다.
이 라이브러리는 WebHooks에 응답하고 Twilio 클라이언트를 종속성 주입 컨테이너에 추가하고 Twilio에서 유래 한 HTTP 요청을 확인합니다.
.NET 6.0 이상이 필요합니다.
.NET CLI를 사용하여 패키지를 설치하려면 다음 명령을 실행하십시오.
dotnet add package Twilio.AspNet.Core또는 패키지 관리자 콘솔 또는 개발자 PowerShell에서 다음 명령을 실행하여 최신 버전을 설치하십시오.
Install-Package Twilio.AspNet.Core또는 Visual Studio의 Nuget 패키지 관리자 또는 JetBrains Rider 용 Nuget Window를 사용한 다음 Twilio.aspnet.core 를 검색하고 패키지를 설치하십시오.
.NET 4.6.2 이상이 필요합니다.
패키지 관리자 콘솔 또는 개발자 PowerShell에서 다음 명령을 실행하여 최신 버전을 설치하십시오.
Install-Package Twilio.AspNet.Mvc또는 Visual Studio의 Nuget 패키지 관리자 또는 JetBrains Rider 용 Nuget Window를 사용한 다음 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 ) ;
}
} 이 컨트롤러는 SMS Webhook을 처리합니다. 들어오는 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 ) ;
}
} 이 컨트롤러는 Voice Webhook을 처리합니다. 들어오는 음성 통화의 세부 사항은 VoiceRequest request 매개 변수에 제대로됩니다. TwilioController 에서 상속하면 TWIML로 응답 할 수있는 TwiML 메소드에 액세스 할 수 있습니다.
TwilioController 에서 상속하는 대신 TwiML 확장 방법을 사용합니다 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를 지원합니다.
이 샘플은 http get and post를 사용하여 SMS Webhook을 손상시키는 방법을 보여줍니다.
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 및 기타 유형 요청 객체가 바인딩되지만 최소 API는 동일한 모델 바인딩을 지원하지 않습니다.
대신 FromQuery 속성을 사용하여 HTTP GET 요청에 대한 개별 매개 변수를 바인딩 할 수 있습니다. FromQuery 속성을 지정하지 않으면 쿼리 문자열 매개 변수 외에 여러 소스가 바인딩되는 것으로 간주됩니다. HTTP Post 요청의 경우 양식을 잡은 다음 String Index로 개별 매개 변수를 검색 할 수 있습니다.
TWIML로 응답하려면 Results.Extensions.TwiML 메소드를 사용하십시오.
Twilio.aspnet에는 여러 클래스가 제공되어 WebHooks에서 강력하게 입력 된 .NET 객체에 데이터를 바인딩 할 수 있습니다. 수업 목록은 다음과 같습니다.
SmsRequest : 들어오는 SMS Webhook 요청에 대한 데이터를 보유합니다SmsStatusCallbackRequest : 아웃 바운드 Twilio SMS 또는 MMS의 전달 상태를 추적하기위한 데이터를 보유합니다.StatusCallbackRequest : 아웃 바운드 트와 일리오 음성 통화 상태를 추적하기위한 데이터를 보유합니다.VoiceRequest : 들어오는 음성 통화에 대한 데이터를 보유합니다참고 MVC 컨트롤러 및 면도 페이지 만 입력 된 .NET 객체에 모델 바인딩을 지원합니다. 최소 API 및 기타 시나리오에서는 매개 변수를 직접 추출하려면 코드를 작성해야합니다.
다음 샘플은 인바운드 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는 객체를 바인딩합니다. 그런 다음 코드는 status 및 method 매개 변수가있는 SMS로 응답합니다. SMS의 상태가 변경되면 Twilio는 HTTP 사후 요청을 StatusCallback 조치로 보냅니다. SmsStatusCallbackRequest 매개 변수로 추가 할 수 있으며 MVC는 객체를 바인딩합니다.
ASP.NET Core에서 .AddTwilioClient 메소드를 사용하여 Twilio REST API 클라이언트를 ASP.NET Core 서비스에 추가 할 수 있습니다.
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 Twilio:AuthToken 으로 돌아갑니다. 그중 하나만 구성하면됩니다.Twilio:Client:CredentialType 에는 다음과 같은 유효한 값이 있습니다. Unspecified , AuthToken 또는 ApiKey .Twilio:Client:CredentialType 는 선택 사항이며 기본값은 Unspecified . Unspecified 경우 API 키를 구성했는지 또는 인증 토큰을 구성했는지 여부는 감지됩니다..NET 구성을 사용하여 Twilio 클라이언트를 구성하지 않으려면 수동으로 수행 할 수 있습니다.
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 ;
} ) ;경고는 인증 토큰 또는 API 키 비밀을 코드로 하드 코딩하지 않으며 소스 컨트롤에 확인하지 마십시오. 지역 개발을 위해 비밀 관리자를 사용하는 것이 좋습니다. 또는 환경 변수, 금고 서비스 또는 기타보다 안전한 기술을 사용할 수 있습니다.
기본적으로 .AddTwilioClient 호출 할 때는 Twilio REST 클라이언트에 HttpClient 제공하는 데 사용되는 HTTP 클라이언트 공장이 구성됩니다. 이 HTTP 클라이언트를 사용자 정의하려면 .AddTwilioClient 를 호출 한 후 "Twilio"HTTP 클라이언트 팩토리를 재정의하여 그렇게 할 수 있습니다.
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는 귀하의 엔드 포인트가 공개적으로 제공되어야하지만, 이는 나쁜 배우가 Webhook URL을 찾고 남용하려고 할 위험도 소개합니다.
운 좋게도 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 Twilio:AuthToken 으로 돌아갑니다. 그중 하나만 구성하면됩니다.AllowLocal 유효성 검사를 건너 뜁니다.BaseUrlOverride 사용하십시오. 현재 요청의 경로는 요청 유효성 검사를 위해 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 ( ) ; 결과적으로 NGROK를 다시 시작하거나 리버스 프록시 URL을 변경할 때마다 BaseUrlOverride 구성 할 필요가 없습니다. 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" ;
} ) ;경고 인증 토큰을 코드로 하드 코딩하지 말고 소스 컨트롤에 확인하지 마십시오. 지역 개발을 위해 비밀 관리자를 사용하는 것이 좋습니다. 또는 환경 변수, 금고 서비스 또는 기타보다 안전한 기술을 사용할 수 있습니다.
요청 유효성 검사가 구성되면 MVC에서 [ValidateRequest] 속성을 사용할 수 있습니다. 전 세계적으로 속성을 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 Core 엔드 포인트에 적용 할 수있는 엔드 포인트 필터의 개념을 소개합니다. ASP.NET Core의 도우미 라이브러리에는 Endpoint 필터가 추가되어 ValidateTwilioRequestFilter 라는 Twilio 요청을 검증했습니다.
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 를 사용할 수 있습니다. 다음과 같이 ValidateTwilioRequestFilter 를 추가 할 수 있습니다.
app . UseTwilioRequestValidation ( ) ;
// or the equivalent: app.UseMiddleware<ValidateTwilioRequestMiddleware>(); 이 미들웨어는 모든 요청에 대한 유효성 검사를 수행합니다. 모든 요청에 유효성 검사를 적용하지 않으려면 app.UseWhen() 사용하여 조건부로 실행할 수 있습니다.
다음은 Twilio 프록시 만 액세스 할 수있는 미디어 파일을 보호하기 위해 Path /Twilio-Media 로 시작하는 요청을 검증하는 방법의 예입니다.
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 유효성 검사를 건너 뜁니다.baseUrlOverride 사용하십시오. 현재 요청의 경로는 요청 유효성 검사를 위해 baseUrlOverride 에 추가됩니다.경고 인증 토큰을 코드로 하드 코딩하지 말고 소스 컨트롤에 확인하지 마십시오. 로컬 개발 또는 다른 구성 빌더 중 하나를 위해
UserSecretsConfigBuilder를 사용하십시오. 또는 인증 토큰과 같은 비밀이 포함 된 구성 섹션을 암호화해야합니다.
요청 유효성 검사가 구성되었으므로 [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 이외의 요청을 확인 해야하는 경우 Twilio.AspNet 에서 제공하는 RequestValidationHelper 클래스를 사용할 수 있습니다. 또는 Twilio SDK의 RequestValidator 클래스도이를 도와 줄 수 있습니다.
다음은 Twilio에서 유래 한 들어오는 요청을 확인하는 최소 API 예입니다.
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 일반적으로 [ValidateRequest] 속성에 사용되는 TwilioRequestValidationOptions 를 추가하지만,이 샘플에서는 요청 유효성 검사 구성을 직접 검색하는 데 사용됩니다. 그런 다음 /SMS 엔드 포인트 내부에서 IsValidTwilioRequest 메소드는 요청을 검증하는 데 사용됩니다. IsValidTwilioRequest DI에서 요청 유효성 검사 옵션을 검색하고 MVC 요청에 대해 [ValidateRequest] 와 동일한 논리를 수행합니다. 요청이 유효하지 않으면 HTTP 상태 코드 403이 반환됩니다. 그렇지 않으면 일부 TWIML이 Twilio로 반환됩니다.