{"record":{"id":"55fce0f7f603f7ae","repo":"dotnet/wpf","slug":"packwebrequestcachepolicyillegal","errorCode":null,"errorMessage":"PackWebRequestCachePolicyIllegal","messagePattern":"PackWebRequestCachePolicyIllegal","errorType":"exception","errorClass":"WebException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationCore/System/IO/Packaging/PackWebRequest.cs","lineNumber":143,"sourceCode":"                            // ignore cache entry\n                            cachedPackageAvailable = false;\n                        } break;\n\n                    case RequestCacheLevel.CacheOnly:\n                        {\n                            // only use cached value\n                            if (!cachedPackageAvailable)\n                                throw new WebException(SR.ResourceNotFoundUnderCacheOnlyPolicy);\n                        } break;\n\n                    case RequestCacheLevel.CacheIfAvailable:\n                        {\n                            // use cached value if possible - we need take no explicit action here\n                        } break;\n\n                    default:\n                        {\n                            throw new WebException(SR.PackWebRequestCachePolicyIllegal);\n                        }\n                }\n            }\n            \n            if (cachedPackageAvailable)\n            {\n#if DEBUG\n                if (PackWebRequestFactory._traceSwitch.Enabled)\n                    System.Diagnostics.Trace.TraceInformation(\n                        DateTime.Now.ToLongTimeString() + \" \" + DateTime.Now.Millisecond + \" \" +\n                        Environment.CurrentManagedThreadId + \": \" + \n                        \"PackWebRequest - Getting response from Package Cache\");\n#endif\n                return new PackWebResponse(_uri, _innerUri, _partName, _cacheEntry, _cachedPackageIsThreadSafe);\n            }\n            else\n            {\n                // only return a real WebRequest instance - throw on a PseudoWebRequest","sourceCodeStart":125,"sourceCodeEnd":161,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/IO/Packaging/PackWebRequest.cs#L125-L161","documentation":"PackWebRequest.GetResponse validates the assigned cache policy before issuing a request. Only BypassCache, CacheOnly, and CacheIfAvailable RequestCacheLevel values are legal for pack:// requests; any other level (e.g. Default, NoCacheNoStore, Reload) causes a WebException wrapping SR.PackWebRequestCachePolicyIllegal. The pack scheme is served from the in-process PackageStore or a nested stream, so arbitrary HTTP-style cache directives cannot be honored.","triggerScenarios":"Calling PackWebRequest.GetResponse after assigning a CachePolicy (or a WebRequest whose cache level was set via CachePolicy/DefaultCachePolicy) whose RequestCacheLevel is not BypassCache, CacheOnly, or CacheIfAvailable.","commonSituations":"Code that reuses generic HTTP client helpers which set CachePolicy = HttpRequestCacheLevel-based or RequestCacheLevel.Default on all WebRequests before fetching pack:// resources; porting code that worked with plain HttpWebRequest.","solutions":["Set CachePolicy to new RequestCachePolicy(RequestCacheLevel.BypassCache) (or CacheOnly / CacheIfAvailable) before calling GetResponse.","Do not mutate CachePolicy on pack WebRequests; leave the default policy in place.","If custom caching is required, cache at the application layer (e.g. store the Package in PackageStore) instead of via cache policy."],"exampleFix":"// before\nreq.CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default);\nvar resp = req.GetResponse();\n// after\nreq.CachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache);\nvar resp = req.GetResponse();","handlingStrategy":"validation","validationCode":"var policy = req.CachePolicy;\nif (req is PackWebRequest && policy != null &&\n    policy.Level != RequestCacheLevel.BypassCache &&\n    policy.Level != RequestCacheLevel.CacheOnly &&\n    policy.Level != RequestCacheLevel.CacheIfAvailable)\n    req.CachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache);","typeGuard":null,"tryCatchPattern":"try { var resp = req.GetResponse(); }\ncatch (WebException ex) when (ex.Message.Contains(\"cache policy\")) { req.CachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache); var resp = req.GetResponse(); }","preventionTips":["Never set CachePolicy on pack:// WebRequests","Centralize request creation so pack requests skip HTTP-oriented policy setup","Restrict shared request helpers to only the three allowed cache levels"],"tags":["wpf","packaging","cache-policy","webrequest"],"backgroundTag":"invalid-enum-value","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-22T01:17:13.364Z"}