Skip to main content

Utilities

This page provides detailed reference documentation for all AsyncEndpoints utility classes, including their properties, methods, and usage examples.

AsyncEndpointError​

Class Definition​

public sealed class AsyncEndpointError

Properties​

Code​

  • Type: string
  • Description: Gets or sets the error code
  • Access: Get and set

Message​

  • Type: string
  • Description: Gets or sets the error message
  • Access: Get and set

Exception​

  • Type: ExceptionInfo?
  • Description: Gets or sets the exception information
  • Access: Get and set

Static Methods​

FromCode​

public static AsyncEndpointError FromCode(string code, string message)

Parameters:

  • code (string): The error code
  • message (string): The error message

Returns: A new AsyncEndpointError instance

Description: Creates an AsyncEndpointError with the specified code and message.

// Example
var error = AsyncEndpointError.FromCode("VALIDATION_ERROR", "Data validation failed");

FromCode (With Exception)​

public static AsyncEndpointError FromCode(string code, string message, Exception exception)

Parameters:

  • code (string): The error code
  • message (string): The error message
  • exception (Exception): The exception to include in the error

Returns: A new AsyncEndpointError instance

Description: Creates an AsyncEndpointError with the specified code, message, and exception information.

// Example
var ex = new InvalidOperationException("Processing failed");
var error = AsyncEndpointError.FromCode("PROCESSING_ERROR", "Processing failed", ex);

FromMessage​

public static AsyncEndpointError FromMessage(string message)

Parameters:

  • message (string): The error message

Returns: A new AsyncEndpointError instance

Description: Creates an AsyncEndpointError with a generic error code and the specified message.

// Example
var error = AsyncEndpointError.FromMessage("An unexpected error occurred");

ExceptionInfo​

Class Definition​

public class ExceptionInfo

Properties​

Type​

  • Type: string
  • Description: Gets or sets the fully qualified name of the exception type
  • Access: Get and set

Message​

  • Type: string
  • Description: Gets or sets the error message
  • Access: Get and set

StackTrace​

  • Type: string
  • Description: Gets or sets the stack trace string
  • Access: Get and set

InnerException​

  • Type: InnerExceptionInfo?
  • Description: Gets or sets information about the inner exception
  • Access: Get and set

Data​

  • Type: Dictionary<string, object?>
  • Description: Gets or sets additional data associated with the exception
  • Access: Get and set

Static Methods​

FromException​

public static ExceptionInfo FromException(Exception ex)

Parameters:

  • ex (Exception): The exception to convert

Returns: An ExceptionInfo containing information from the exception

Description: Creates an ExceptionInfo from an exception.

// Example
try
{
throw new InvalidOperationException("Test exception");
}
catch (Exception ex)
{
var exceptionInfo = ExceptionInfo.FromException(ex);
}

Instance Methods​

ToException​

public Exception ToException()

Returns: An Exception object

Description: Reconstructs an exception from the information.

// Example
var exceptionInfo = ExceptionInfo.FromException(new InvalidOperationException("Test"));
var exception = exceptionInfo.ToException();

InnerExceptionInfo​

Class Definition​

public class InnerExceptionInfo

Properties​

Type​

  • Type: string
  • Description: Gets or sets the fully qualified name of the inner exception type
  • Access: Get and set

Message​

  • Type: string
  • Description: Gets or sets the inner exception message
  • Access: Get and set

StackTrace​

  • Type: string
  • Description: Gets or sets the inner exception stack trace string
  • Access: Get and set

Static Methods​

FromException​

public static InnerExceptionInfo FromException(Exception ex)

Parameters:

  • ex (Exception): The exception to convert

Returns: An InnerExceptionInfo containing information from the exception

Description: Creates an InnerExceptionInfo from an exception.

// Example
try
{
throw new InvalidOperationException("Inner exception", new ArgumentException("Inner argument exception"));
}
catch (Exception ex)
{
var innerExceptionInfo = InnerExceptionInfo.FromException(ex.InnerException);
}

MethodResult&lt;T> Usage Patterns​

Success Pattern​

// Returning successful results
public async Task<MethodResult<ProcessResult>> ProcessDataAsync(DataRequest request, CancellationToken token)
{
try
{
// Process successfully
var result = new ProcessResult
{
ProcessedData = request.Data.ToUpper(),
ProcessedAt = DateTime.UtcNow
};

return MethodResult<ProcessResult>.Success(result);
}
catch (Exception ex)
{
// Handle error
return MethodResult<ProcessResult>.Failure(ex);
}
}

Failure Pattern​

public async Task<MethodResult<ProcessResult>> ValidateAndProcessAsync(DataRequest request, CancellationToken token)
{
// Validate input
if (string.IsNullOrWhiteSpace(request.Data))
{
var error = AsyncEndpointError.FromCode("VALIDATION_ERROR", "Data field is required");
return MethodResult<ProcessResult>.Failure(error);
}

// Process successfully
var result = new ProcessResult
{
ProcessedData = request.Data.ToUpper(),
ProcessedAt = DateTime.UtcNow
};

return MethodResult<ProcessResult>.Success(result);
}

Error Handling with MethodResult​

public async Task<MethodResult<ProcessResult>> ComplexProcessingAsync(ComplexRequest request, CancellationToken token)
{
try
{
// Perform multiple operations
var step1Result = await Step1Async(request, token);
if (!step1Result.IsSuccess)
{
return MethodResult<ProcessResult>.Failure(step1Result.Error!);
}

var step2Result = await Step2Async(step1Result.Data, token);
if (!step2Result.IsSuccess)
{
return MethodResult<ProcessResult>.Failure(step2Result.Error!);
}

// Final result
return MethodResult<ProcessResult>.Success(step2Result.Data);
}
catch (Exception ex)
{
return MethodResult<ProcessResult>.Failure(ex);
}
}

Serialization Utilities​

AsyncEndpointsJsonSerializationContext​

This is a generated JSON serialization context that provides efficient serialization for AsyncEndpoints types.

// Example usage for custom serialization
var options = new JsonSerializerOptions
{
TypeInfoResolver = AsyncEndpointsJsonSerializationContext.Default
};

var serialized = JsonSerializer.Serialize(job, AsyncEndpointsJsonSerializationContext.Default.Job);
var deserialized = JsonSerializer.Deserialize<Job>(serialized, AsyncEndpointsJsonSerializationContext.Default.Job);

Helper Classes​

NoBodyRequest​

A special request type used for handlers that don't require a request body.

public sealed class NoBodyRequest
{
private static readonly NoBodyRequest _instance = new();

private NoBodyRequest() { }

public static NoBodyRequest CreateInstance() => _instance;
}

Usage:

// Used in handlers without body
public class GenerateReportHandler : IAsyncEndpointRequestHandler<ReportResult>
{
public async Task<MethodResult<ReportResult>> HandleAsync(AsyncContext context, CancellationToken token)
{
// Process without request body
var result = new ReportResult
{
ReportData = "Generated report...",
GeneratedAt = DateTime.UtcNow
};

return MethodResult<ReportResult>.Success(result);
}
}

Error Classifier​

ErrorType Enum​

public enum ErrorType
{
Permanent, // Should not be retried
Transient, // Can be retried
Unknown // Retry behavior unknown
}

ErrorClassifier​

An abstract class for determining error types.

public abstract class ErrorClassifier
{
public abstract ErrorType ClassifyError(Exception ex);

protected virtual ErrorType ClassifySystemError(Exception ex)
{
return ex switch
{
TimeoutException => ErrorType.Transient,
HttpRequestException => ErrorType.Transient,
InvalidOperationException => ErrorType.Permanent,
ArgumentException => ErrorType.Permanent,
_ => ErrorType.Unknown
};
}
}

Example Implementation:

public class CustomErrorClassifier : ErrorClassifier
{
public override ErrorType ClassifyError(Exception ex)
{
return ex switch
{
DataValidationException => ErrorType.Permanent,
NetworkException netEx when netEx.IsTransient => ErrorType.Transient,
_ => ClassifySystemError(ex)
};
}
}

Response Utilities​

ResponseDefaults​

Provides default response creation methods.

public static class ResponseDefaults
{
public static Task<IResult> CreateJobSubmittedResponse(Job job, HttpContext context)
{
return Task.FromResult<IResult>(Results.Accepted($"/jobs/{job.Id}", job));
}

public static Task<IResult> CreateJobStatusResponse(MethodResult<Job> jobResult, HttpContext context)
{
if (jobResult.IsSuccess && jobResult.Data != null)
{
return Task.FromResult<IResult>(Results.Ok(jobResult.Data));
}

return Task.FromResult<IResult>(Results.NotFound());
}

public static Task<IResult> CreateJobSubmissionErrorResponse(AsyncEndpointError? error, HttpContext context)
{
return Task.FromResult<IResult>(Results.Problem(
title: "Job Submission Failed",
detail: error?.Message,
statusCode: 500
));
}

public static Task<IResult> CreateExceptionResponse(Exception exception, HttpContext context)
{
return Task.FromResult<IResult>(Results.Problem(
title: "Internal Server Error",
detail: "An error occurred while processing the request",
statusCode: 500
));
}
}

DateTime Provider​

IDateTimeProvider Interface​

public interface IDateTimeProvider
{
DateTimeOffset DateTimeOffsetNow { get; }
DateTime UtcNow { get; }
}

DateTimeProvider Implementation​

public class DateTimeProvider : IDateTimeProvider
{
public DateTimeOffset DateTimeOffsetNow => DateTimeOffset.UtcNow;
public DateTime UtcNow => DateTime.UtcNow;
}

Usage in Job Creation:

var dateTimeProvider = new DateTimeProvider();
var job = Job.Create(
Guid.NewGuid(),
"ProcessData",
serializedPayload,
headers,
routeParams,
queryParams,
dateTimeProvider
);

These utilities provide comprehensive error handling, serialization, and helper functionality that support the core AsyncEndpoints functionality.