Skip to main content
Version: Next (unreleased)

Connection Settings

Connection settings are the configuration parameters used to establish and customize connector behavior.

What are Connection Settings​

The ConnectionSettings class is the primary mechanism for configuring connectors. It provides:

  • Key-value parameter storage - All settings are stored as string keys with object values
  • Schema-based validation - Optional validation against channel schemas
  • Type-safe retrieval - Generic GetParameter<T>() methods with automatic type conversion
  • Default value support - Schema-defined defaults for optional parameters
var settings = new ConnectionSettings()
.SetParameter("AccountSid", "AC123456")
.SetParameter("AuthToken", "secret")
.SetParameter("MaxRetries", 3);

Parameter Types​

Connection settings support four fundamental data types defined by the DataType enumeration:

DataTypeDescriptionCompatible C# TypesExample
StringText valuesstring"AC123456"
IntegerWhole numbersint, long, byte, short, sbyte3
NumberDecimal valuesdouble, decimal, float0.01
BooleanTrue/false flagsbooltrue

Each connector schema defines which parameters it accepts and their expected data types.

Type Conversion​

Connection settings support automatic type conversion between compatible types, making it flexible to work with configuration from different sources.

String to Numeric Conversion​

String values are automatically converted to numeric types when the schema expects a number:

// Schema expects Integer
settings.SetParameter("MaxRetries", "3"); // String "3" → int 3

// Schema expects Number
settings.SetParameter("MaxPrice", "0.01"); // String "0.01" → decimal 0.01

This is particularly useful when loading from configuration files or connection strings where all values are strings.

Numeric to String Conversion​

Numeric values can be stored and retrieved as strings:

settings.SetParameter("Timeout", 60); // int 60 stored
var timeout = settings.GetParameter<string>("Timeout"); // Returns "60"

Boolean Parsing​

Boolean values support case-insensitive string parsing:

settings.SetParameter("DryRun", "true"); // String "true" → bool true
settings.SetParameter("DryRun", "TRUE"); // Also works (case-insensitive)
settings.SetParameter("DryRun", "false"); // String "false" → bool false

Type-Safe Retrieval​

Use generic GetParameter<T>() for type-safe access:

var maxRetries = settings.GetParameter<int>("MaxRetries");
var dryRun = settings.GetParameter<bool>("DryRun");
var authToken = settings.GetParameter<string>("AuthToken");

The method validates that the stored value can be converted to the requested type and throws InvalidCastException if conversion is not possible.

Schema Validation​

When a ConnectionSettings instance is created with a schema, all parameter operations are validated:

var settings = new ConnectionSettings(schema);

Required Parameters​

Parameters marked as IsRequired = true must have non-null values:

// Schema definition example
new ChannelParameter("AuthToken", DataType.String)
{
IsRequired = true
}

// Validation - throws ArgumentException if null
settings.SetParameter("AuthToken", null); // ❌ Throws ArgumentException

Validation occurs at SetParameter() time, not at connector initialization, providing immediate feedback.

Allowed Values (Enumerated Constraints)​

Parameters can restrict values to a specific set:

// Schema definition
new ChannelParameter("ParseMode", DataType.String)
{
AllowedValues = new[] { "Markdown", "HTML", "Plain" }
}

// Validation
settings.SetParameter("ParseMode", "Markdown"); // ✅ Valid
settings.SetParameter("ParseMode", "XML"); // ❌ Throws - not in allowed list

Min/Max Constraints​

Numeric and string parameters can define range constraints:

// Numeric constraints
new ChannelParameter("MaxPrice", DataType.Number)
{
MinValue = 0,
MaxValue = 1000
}

settings.SetParameter("MaxPrice", 500); // ✅ Valid
settings.SetParameter("MaxPrice", 1500); // ❌ Throws - exceeds max

// String length constraints
new ChannelParameter("SenderName", DataType.String)
{
MinLength = 1,
MaxLength = 11 // SMS sender ID limit
}

settings.SetParameter("SenderName", "MyCompany"); // ✅ Valid
settings.SetParameter("SenderName", "MyVeryLongName123"); // ❌ Throws - too long

Data Type Validation​

The schema enforces type compatibility:

// Schema expects Integer
new ChannelParameter("MaxRetries", DataType.Integer)

settings.SetParameter("MaxRetries", "not-a-number"); // ❌ Throws - not convertible
settings.SetParameter("MaxRetries", "3"); // ✅ Valid - convertible string

Sensitive Parameters​

Parameters marked as IsSensitive = true are automatically redacted in framework logs:

// Schema definition
new ChannelParameter("AuthToken", DataType.String)
{
IsSensitive = true
}

// In framework logs:
// AuthToken="***" instead of the actual value

What gets redacted:

  • Parameter values in logging scopes
  • Connection settings dump in debug logs
  • Error messages that include parameter values

Best Practices:

  • ✅ Mark all credentials as sensitive (API keys, tokens, passwords)
  • ✅ Mark authentication tokens and secrets
  • ✅ Mark webhook secret tokens
  • ❌ Don't mark non-sensitive configuration (URLs, IDs, feature flags)

Default Values​

Schema can define default values for optional parameters:

// Schema definition
new ChannelParameter("MaxRetries", DataType.Integer)
{
DefaultValue = 3,
IsRequired = false
}

// Retrieval - returns default if not explicitly set
var retries = settings.GetParameter<int>("MaxRetries"); // Returns 3

Default value behavior:

  • Defaults are used when GetParameter() is called for a parameter that wasn't set
  • Defaults do NOT populate the Parameters dictionary - they're applied on retrieval
  • You can override defaults by explicitly setting a value

Setting Parameters​

Programmatic Approach​

Direct parameter setting with method chaining:

var settings = new ConnectionSettings()
.SetParameter("AccountSid", "AC123456")
.SetParameter("AuthToken", "secret")
.SetParameter("MaxRetries", 3)
.SetParameter("DryRun", true);

Indexer Syntax​

Alternative syntax using indexer:

var settings = new ConnectionSettings();
settings["AccountSid"] = "AC123456";
settings["AuthToken"] = "secret";
settings["MaxRetries"] = 3;

From Configuration Sections​

Load settings from appsettings.json or other IConfiguration sources:

{
"Twilio": {
"AccountSid": "AC123456",
"AuthToken": "secret",
"MaxRetries": 3
}
}
builder.Services
.AddMessaging()
.AddConnector<TwilioSmsConnector>(cfg => cfg
.WithSettings("Twilio")); // Reads from "Twilio" section

Nested configuration is flattened:

{
"Twilio": {
"AccountSid": "AC123456",
"Timeout": {
"Send": "00:01:00",
"Receive": "00:00:30"
}
}
}

Results in parameters: AccountSid, Timeout.Send, Timeout.Receive.

From Connection Strings​

Compact semicolon-delimited format:

cfg.WithConnectionString("AccountSid=AC123;AuthToken=secret;MaxRetries=3");

See Connection Strings for detailed format documentation.

From Typed Options​

Use strongly-typed options classes:

var options = new TwilioSmsOptions
{
AccountSid = "AC123456",
AuthToken = "secret",
SendTimeout = TimeSpan.FromSeconds(60),
ReceiveTimeout = TimeSpan.FromSeconds(30)
};

cfg.WithOptions(options);

The ToConnectionSettings() method converts typed options to parameter dictionaries.

Retrieving Parameters​

Basic Retrieval​

var accountSid = settings.GetParameter("AccountSid"); // Returns object?
var maxRetries = settings.GetParameter<int>("MaxRetries"); // Returns int
var dryRun = settings.GetParameter<bool>("DryRun"); // Returns bool

With Default Fallback​

// Returns default from schema if not set
var retries = settings.GetParameter<int>("MaxRetries");

// Returns your default if schema has none
var timeout = settings.Parameters.TryGetValue("Timeout", out var val)
? (TimeSpan)val!
: TimeSpan.FromSeconds(30);

Checking for Parameter Existence​

if (settings.Parameters.ContainsKey("AccountSid"))
{
var accountSid = settings.GetParameter<string>("AccountSid");
}

Validation Errors​

When validation fails, clear error messages are provided:

ArgumentException: The parameter 'AuthToken' is required by this schema
ArgumentException: The parameter 'ParseMode' is not supported by this schema
ArgumentException: The value 'XML' is not allowed for the parameter 'ParseMode'
ArgumentException: The value provided for the key 'MaxRetries' is not compatible with the type 'Integer'

Security Considerations​

Credential Management​

Never store secrets in source code. Use environment variables, user secrets (development), or a vault (production):

// appsettings.json — use placeholders, not real values
{
"Twilio": {
"AccountSid": "",
"AuthToken": ""
}
}

// Environment variables override at runtime
export Twilio__AccountSid="AC..."
export Twilio__AuthToken="..."

Sensitive Parameter Redaction​

Mark schema parameters as IsSensitive — the framework redacts their values in logs:

new ChannelParameter("AuthToken", DataType.String)
{
IsRequired = true,
IsSensitive = true
};

When logging, sensitive parameter values appear as "***" instead of the actual value.

Webhook Signature Validation​

Inbound webhooks from providers include cryptographic signatures. Always validate them:

  • Twilio: validate X-Twilio-Signature header using your auth token
  • Telegram: set SecretToken and validate X-Telegram-Bot-Api-Secret-Token
  • Facebook: validate X-Hub-Signature-256 using your app secret
  • SendGrid: validate X-Twilio-Email-Event-Webhook-Signature

Named Connector Isolation​

Use named connectors to isolate different connector instances:

services.AddMessaging()
.AddConnector<TwilioSmsConnector>("primary", cfg => cfg
.WithSettings("Twilio:Primary"))
.AddConnector<TwilioSmsConnector>("secondary", cfg => cfg
.WithSettings("Twilio:Secondary"));

See Also​