{"record":{"id":"759af7959dbfd060","repo":"HangfireIO/Hangfire","slug":"the-order-value-should-be-greater-or-equal-to-1","errorCode":null,"errorMessage":"The Order value should be greater or equal to '-1'","messagePattern":"The Order value should be greater or equal to '-1'","errorType":"exception","errorClass":"ArgumentOutOfRangeException","httpStatus":null,"severity":"error","filePath":"src/Hangfire.Core/Common/JobFilterAttribute.cs","lineNumber":46,"sourceCode":"    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Method)]\n    public abstract class JobFilterAttribute : Attribute, IJobFilter\n    {\n        private static readonly ConcurrentDictionary<Type, bool> MultiuseAttributeCache = new ConcurrentDictionary<Type, bool>();\n        private int _order = JobFilter.DefaultOrder;\n\n        [JsonIgnore]\n        public bool AllowMultiple => AllowsMultiple(GetType());\n\n        [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)]\n        [DefaultValue(JobFilter.DefaultOrder)]\n        public int Order\n        {\n            get { return _order; }\n            set\n            {\n                if (value < JobFilter.DefaultOrder)\n                {\n                    throw new ArgumentOutOfRangeException(nameof(value), \"The Order value should be greater or equal to '-1'\");\n                }\n                _order = value;\n            }\n        }\n\n#if !NETSTANDARD1_3\n        [JsonIgnore]\n        public override object TypeId => base.TypeId;\n#endif\n\n        private static bool AllowsMultiple(Type attributeType)\n        {\n            return MultiuseAttributeCache.GetOrAdd(\n                attributeType,\n                static type => type.GetTypeInfo()\n                            .GetCustomAttributes<AttributeUsageAttribute>(inherit: true)\n                            .First()\n                            .AllowMultiple);","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/HangfireIO/Hangfire/blob/c236dd0f930f831ec151e436e138ddc429a02a72/src/Hangfire.Core/Common/JobFilterAttribute.cs#L28-L64","documentation":"JobFilterAttribute.Order controls filter execution precedence. The setter at JobFilterAttribute.cs:46 enforces a floor of JobFilter.DefaultOrder (which is -1, the value filters get when no explicit order is set). Any value below -1 is rejected because it would place a filter before the framework's own default-priority filters, producing undefined execution semantics.","triggerScenarios":"Explicitly assigning a negative value less than -1 to the Order property of any JobFilterAttribute subclass, e.g. attr.Order = -5; or myFilter.Order = int.MinValue.","commonSituations":"Trying to force a filter to run before everything else by using an arbitrarily negative number; copying a pattern from another DI framework that allows any int; deserializing filter config from JSON with an out-of-range value.","solutions":["Set Order to a value >= -1 (use 0 or higher for custom filters).","If you need the earliest execution, use Order = -1 (JobFilter.DefaultOrder).","Validate configuration-sourced Order values before assignment if they come from external config."],"exampleFix":"// before\nattr.Order = -10;\n\n// after\nattr.Order = 0;","handlingStrategy":"validation","validationCode":"const int MinOrder = -1; // JobFilter.DefaultOrder\nif (configuredOrder < MinOrder)\n    throw new ArgumentOutOfRangeException(nameof(configuredOrder),\n        $\"Order must be >= {MinOrder}.\");\nattr.Order = configuredOrder;","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat -1 as the lowest valid Order value.","Validate externally-sourced Order values (config, JSON) before assignment.","Prefer non-negative Order values for custom filters."],"tags":["filter","argument-range","configuration"],"backgroundTag":null,"analyzedSha":"c236dd0f930f831ec151e436e138ddc429a02a72","analyzedAt":"2026-08-13T20:27:11.027Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}