๐ง Utilities & Tools
Helpful utilities for background tasks, debugging, and productivity enhancements
๐ฅ FireAndForget Utility
Execute non-critical background tasks without blocking your main thread.
- Safe task execution with automatic error handling
- No need to await - truly fire-and-forget
- Built-in logging for troubleshooting
- Perfect for notifications, logging, analytics
๐ cURL Command Generator
Generate cURL commands from your HTTP requests for debugging.
- Recreate requests outside your application
- Share with team members for collaboration
- Test APIs from command line
- Includes headers and request body
๐ Code Examples
FireAndForget Utility
// Register the utility in Program.cs
builder.Services.AddSingleton<FireAndForgetUtility>();
// Use in your service
public class MyService
{
private readonly FireAndForgetUtility _fireAndForget;
public MyService(FireAndForgetUtility fireAndForget)
{
_fireAndForget = fireAndForget;
}
public void ProcessOrder(Order order)
{
// Critical: Save the order (awaited)
await SaveOrderToDatabase(order);
// Non-critical: Send confirmation email (fire-and-forget)
_fireAndForget.SafeFireAndForget(
SendConfirmationEmailAsync(order.Email),
$"Send confirmation email for order {order.Id}");
// Non-critical: Update analytics (fire-and-forget)
_fireAndForget.SafeFireAndForget(
UpdateAnalyticsAsync(order),
$"Update analytics for order {order.Id}");
// Return immediately without waiting for emails or analytics
return Ok();
}
private async Task SendConfirmationEmailAsync(string email)
{
// Email sending logic
await _emailService.SendAsync(email, "Order Confirmed");
}
private async Task UpdateAnalyticsAsync(Order order)
{
// Analytics update logic
await _analyticsService.TrackOrderAsync(order);
}
}
cURL Command Generator
using WebSpark.HttpClientUtility.Utilities;
// Generate cURL command from request
var curlCommand = CurlCommandSaver.GenerateCurlCommand(
requestPath: "https://api.example.com/orders",
method: HttpMethod.Post,
headers: new Dictionary<string, string>
{
{ "Authorization", "Bearer token123" },
{ "Content-Type", "application/json" }
},
body: "{\"productId\": 42, \"quantity\": 1}"
);
// Output: curl -X POST "https://api.example.com/orders" \
// -H "Authorization: Bearer token123" \
// -H "Content-Type: application/json" \
// -d "{\"productId\": 42, \"quantity\": 1}"
// Save to file for later use
await File.WriteAllTextAsync("debug-request.sh", curlCommand);
// Or log it for debugging
_logger.LogDebug("Request as cURL: {CurlCommand}", curlCommand);
Query String Builder
// Build complex query strings easily
var queryParams = new Dictionary<string, string>
{
{ "category", "electronics" },
{ "minPrice", "100" },
{ "maxPrice", "500" },
{ "sortBy", "price" },
{ "order", "desc" }
};
// Convert to query string
var queryString = string.Join("&",
queryParams.Select(kvp => $"{Uri.EscapeDataString(kvp.Key)}={Uri.EscapeDataString(kvp.Value)}"));
var url = $"https://api.example.com/products?{queryString}";
// Result: https://api.example.com/products?category=electronics&minPrice=100&maxPrice=500&sortBy=price&order=desc
๐ฏ Common Use Cases
FireAndForget Perfect For:
- ๐ง Sending email notifications
- ๐ Updating analytics/metrics
- ๐ Logging to external services
- ๐ Pushing notifications
- ๐ Cache warming
- ๐งน Background cleanup tasks
cURL Generator Perfect For:
- ๐ Debugging API issues
- ๐ค Sharing requests with teammates
- ๐ Documentation generation
- ๐งช Testing outside the application
- ๐ Reproducing production issues
- ๐ Support ticket details
Best Practices
FireAndForget โ Do
- Use for truly non-critical operations
- Provide descriptive task names
- Implement proper error handling in tasks
- Consider idempotency
- Monitor background task failures
FireAndForget โ Don't
- Use for critical business logic
- Rely on immediate execution
- Store results for later use
- Use for transaction-dependent operations
- Forget about monitoring/logging
โจ Additional Utilities
URL Sanitization
Automatically sanitize URLs before logging to prevent sensitive data exposure:
// Removes query parameters, credentials, and sensitive data
var safeUrl = LoggingUtility.SanitizeUrl("https://user:[email protected]/data?apiKey=secret");
// Result: "https://api.com/data"
Error Handling Utilities
Enrich exceptions with context for better debugging:
var context = new Dictionary<string, object>
{
["UserId"] = userId,
["RequestPath"] = requestPath,
["CorrelationId"] = correlationId
};
var enrichedException = ErrorHandlingUtility.EnrichException(
exception,
"Failed to process user request",
context
);