{"record":{"id":"1ab92559c2ef90cd","repo":"OrchardCMS/OrchardCore","slug":"the-file-extension-should-start-with-a-dot","errorCode":null,"errorMessage":"The file extension should start with a dot.","messagePattern":"The file extension should start with a dot\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/OrchardCore/OrchardCore.Media.Abstractions/Indexing/MediaFileIndexingOptions.cs","lineNumber":35,"sourceCode":"\n        return this;\n    }\n\n    public Type GetRegisteredMediaFileTextProvider(string fileExtension)\n    {\n        if (_mediaFileTextProviderRegistrations.TryGetValue(ValidateFileExtension(fileExtension), out var providerType))\n        {\n            return providerType;\n        }\n\n        return null;\n    }\n\n    private static string ValidateFileExtension(string fileExtension)\n    {\n        if (!fileExtension.StartsWith('.'))\n        {\n            throw new ArgumentException(\"The file extension should start with a dot.\");\n        }\n\n        return fileExtension;\n    }\n}\n","sourceCodeStart":17,"sourceCodeEnd":41,"githubUrl":"https://github.com/OrchardCMS/OrchardCore/blob/4306c0717fe573f6fca1b4955909ddab6a192807/src/OrchardCore/OrchardCore.Media.Abstractions/Indexing/MediaFileIndexingOptions.cs#L17-L41","documentation":"MediaFileIndexingOptions validates that every registered file extension key starts with a dot so extension lookups are normalized. Registering an extension like \"pdf\" instead of \".pdf\" throws ArgumentException at registration time.","triggerScenarios":"Calling RegisterMediaFileTextProvider (or configuring MediaFileTextProviders options) with a dictionary key such as \"pdf\", \"TXT\", or \"md\" that lacks the leading dot.","commonSituations":"Copy-pasting extension names from filenames (\"document.pdf\") or MIME types without normalizing; building options programmatically from a list of extensions formatted without dots.","solutions":["Prefix the extension with a dot: \".pdf\" instead of \"pdf\".","Normalize keys at configuration load time: if (!ext.StartsWith('.')) ext = \".\" + ext;","Check startup logs/options validation to find the offending extension key."],"exampleFix":"// before\nservices.Configure<MediaFileIndexingOptions>(o => o.TextProviders[\"pdf\"] = myProvider);\n// after\nservices.Configure<MediaFileIndexingOptions>(o => o.TextProviders[\".pdf\"] = myProvider);","handlingStrategy":"validation","validationCode":"if (!fileExtension.StartsWith('.'))\n    fileExtension = \".\" + fileExtension.TrimStart('*');","typeGuard":"static bool IsValidFileExtension(string ext) => !string.IsNullOrEmpty(ext) && ext.StartsWith('.');","tryCatchPattern":"catch (ArgumentException ex) when (ex.Message.Contains(\"file extension should start with a dot\"))\n{\n    // normalize the key and retry registration\n}","preventionTips":["Normalize extension keys to dotted lowercase form at config load.","Derive extensions from Path.GetExtension (which keeps the dot), not string splits.","Add options validation on startup to fail fast on undotted keys."],"tags":["media","configuration","validation"],"backgroundTag":"invalid-config-value","analyzedSha":"4306c0717fe573f6fca1b4955909ddab6a192807","analyzedAt":"2026-09-13T17:41:05.024Z","contentChangedAt":"2026-09-13T17:41:05.024Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}