{"record":{"id":"b3d945aba7966332","repo":"dotnet/orleans","slug":"invalid-nameof-adonetstreamoptions-values-for-a-b3d945","errorCode":null,"errorMessage":"Invalid {nameof(AdoNetStreamOptions)} values for ADO.NET Streaming Provider '{name}': {nameof(options.ExpiryTimeout)} must be greater than zero.","messagePattern":"Invalid (.+?) values for ADO\\.NET Streaming Provider '(.+?)': (.+?) must be greater than zero\\.","errorType":"validation","errorClass":"OrleansConfigurationException","httpStatus":null,"severity":"error","filePath":"src/AdoNet/Orleans.Streaming.AdoNet/AdoNetStreamOptionsValidator.cs","lineNumber":40,"sourceCode":"\n        if (options.MaxAttempts < 0)\n        {\n            throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetStreamOptions)} values for ADO.NET Streaming Provider '{name}': {nameof(options.MaxAttempts)} must be greater than zero.\");\n        }\n\n        if (options.VisibilityTimeout < TimeSpan.Zero)\n        {\n            throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetStreamOptions)} values for ADO.NET Streaming Provider '{name}': {nameof(options.VisibilityTimeout)} must be greater than zero.\");\n        }\n\n        if (options.EvictionInterval < TimeSpan.Zero)\n        {\n            throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetStreamOptions)} values for ADO.NET Streaming Provider '{name}': {nameof(options.EvictionInterval)} must be greater than zero.\");\n        }\n\n        if (options.ExpiryTimeout < TimeSpan.Zero)\n        {\n            throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetStreamOptions)} values for ADO.NET Streaming Provider '{name}': {nameof(options.ExpiryTimeout)} must be greater than zero.\");\n        }\n\n        if (options.DeadLetterEvictionTimeout < TimeSpan.Zero)\n        {\n            throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetStreamOptions)} values for ADO.NET Streaming Provider '{name}': {nameof(options.DeadLetterEvictionTimeout)} must be greater than zero.\");\n        }\n\n        if (options.EvictionBatchSize < 0)\n        {\n            throw new OrleansConfigurationException($\"Invalid {nameof(AdoNetStreamOptions)} values for ADO.NET Streaming Provider '{name}': {nameof(options.EvictionBatchSize)} must be greater than zero.\");\n        }\n    }\n}","sourceCodeStart":22,"sourceCodeEnd":53,"githubUrl":"https://github.com/dotnet/orleans/blob/fca799fa70ecb6ad975224271703ca43221f58de/src/AdoNet/Orleans.Streaming.AdoNet/AdoNetStreamOptionsValidator.cs#L22-L53","documentation":"Thrown by the ADO.NET streaming options validator when ExpiryTimeout is negative. ExpiryTimeout is how long before a message is considered expired and moved to dead letters regardless of attempt count. The check is `< TimeSpan.Zero`, so zero is accepted though the message says 'greater than zero'.","triggerScenarios":"ValidateConfiguration() runs on AdoNetStreamOptions with ExpiryTimeout < TimeSpan.Zero. The default is 10 minutes, so this only fires if it was explicitly set negative.","commonSituations":"Setting ExpiryTimeout to a negative TimeSpan; mistyping a duration string in config; unit confusion when computing the value.","solutions":["Set options.ExpiryTimeout to a positive TimeSpan greater than VisibilityTimeout (e.g. the default 10 minutes).","Check the appsettings.json string format and sign.","Use TimeSpan.FromMinutes to set it explicitly and keep it > VisibilityTimeout."],"exampleFix":"// before\nbuilder.AddAdoNetStreams(\"ads\", o =>\n{\n    o.ExpiryTimeout = TimeSpan.FromMinutes(-10);\n});\n\n// after\nbuilder.AddAdoNetStreams(\"ads\", o =>\n{\n    o.ExpiryTimeout = TimeSpan.FromMinutes(10);\n});","handlingStrategy":"validation","validationCode":"static void CheckExpiryTimeout(AdoNetStreamOptions o)\n{\n    if (o.ExpiryTimeout < TimeSpan.Zero)\n        throw new InvalidOperationException(\"AdoNetStreamOptions.ExpiryTimeout must be non-negative and greater than VisibilityTimeout.\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep ExpiryTimeout positive and larger than VisibilityTimeout.","Use TimeSpan.FromMinutes with explicit positive values.","Add a config test asserting the relationship of stream timeouts."],"tags":["configuration","adonet","streaming","timeout","startup-validation"],"backgroundTag":null,"analyzedSha":"fca799fa70ecb6ad975224271703ca43221f58de","analyzedAt":"2026-08-13T19:55:57.938Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}