The default branch name for this repository has been changed to
main as of 07/27/2020.
Twilio REST API and TwiML Libraries for .NET
Twilio provides a simple HTTP-based API for sending and receiving phone calls and text messages. Learn more on twilio.com.
More documentation for this library can be found here.
twilio-csharp uses a modified version of Semantic Versioning for all changes. [See this document](VERSIONS.md) for details.
Migrating from earlier versions
TLS 1.2 Requirements
New accounts and subaccounts are now required to use TLS 1.2 when accessing the REST API. "Upgrade Required" errors indicate that TLS 1.0/1.1 is being used. With .NET, you can enable TLS 1.2 using this setting:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Supported .NET versions
This library supports .NET applications that utilize .NET Framework 3.5+ or .NET Core 1.0+ (.NET Standard 1.4).
The best and easiest way to add the Twilio libraries to your .NET project is to use the NuGet package manager.
With Visual Studio IDE
From within Visual Studio, you can use the NuGet GUI to search for and install the Twilio NuGet package. Or, as a shortcut, simply type the following command into the Package Manager Console:
With .NET Core Command Line Tools
If you are building with the .NET Core command line tools, then you can run the following command from within your project directory:
dotnet add package Twilio
The examples below show how to have your application initiate and outbound phone call and send an SMS message using the Twilio .NET helper library:
TwilioClient.Init("ACCOUNT_SID", "AUTH_TOKEN"); var call = CallResource.Create( new PhoneNumber("+11234567890"), from: new PhoneNumber("+10987654321"), url: new Uri("https://my.twiml.here") ); Console.WriteLine(call.Sid); var message = MessageResource.Create( new PhoneNumber("+11234567890"), from: new PhoneNumber("+10987654321"), body: "Hello World!" ); Console.WriteLine(message.Sid);
Specify Region and/or Edge
To take advantage of Twilio's Global Infrastructure, specify the target Region and/or Edge for the client:
This will result in the
hostname transforming from
Enable Debug Logging
There are two ways to enable debug logging in the default HTTP client. You can create an environment variable called
TWILIO_LOG_LEVEL and set it to
debug or you can set the LogLevel variable on the client as debug:
For an example on how to handle exceptions in this helper library, please see the Twilio documentation.
To control phone calls, your application needs to output TwiML.
// TwiML classes can be created as standalone elements var gather = new Gather(numDigits: 1, action: new Uri("hello-monkey-handle-key.cshtml"), method: HttpMethod.Post) .Say("To speak to a real monkey, press 1. Press 2 to record your own monkey howl. Press any other key to start over."); // Attributes can be set directly on the object gather.Timeout = 100; gather.MaxSpeechTime = 200 // Arbitrary attributes can be set by calling set/getOption var dial = new Dial().SetOption("myAttribute", 200) .SetOption("newAttribute", false); // Or can be created and attached to a response directly using helper methods var response = new VoiceResponse() .Say("Hello Monkey") .Play(new Uri("http://demo.twilio.com/hellomonkey/monkey.mp3")) .Append(gather) .Append(dial); // Serialize the TwiML objects to XML string Console.WriteLine(response); /* <?xml version="1.0" encoding="utf-8"?> <Response> <Say>Hello Monkey</Say> <Play>http://demo.twilio.com/hellomonkey/monkey.mp3</Play> <Gather numDigits="1" action="hello-monkey-handle-key.cshtml" method="POST" timeout="100" maxSpeechTime="200"> <Say>To speak to a real monkey, press 1. Press 2 to record your own monkey howl. Press any other key to start over.</Say> </Gather> <Dial myAttribute="200" newAttribute="false"></Dial> </Response> */
Using a Custom HTTP Client
To use a custom HTTP client with this helper library, please see the Twilio documentation.
Dockerfile present in this repository and its respective
twilio/twilio-csharp Docker image are currently used by Twilio for testing purposes only.
If you've instead found a bug in the library or would like new features added, go ahead and open issues or pull requests against this repo!