{"record":{"id":"d6bf9f02e6de2691","repo":"dotnet/wpf","slug":"sr-packageparttypenotwritable","errorCode":null,"errorMessage":"SR.PackagePartTypeNotWritable","messagePattern":"SR\\.PackagePartTypeNotWritable","errorType":"exception","errorClass":"NotSupportedException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationUI/MS/Internal/Documents/Application/RestrictedTransactionalPackage.cs","lineNumber":54,"sourceCode":"    internal RestrictedTransactionalPackage(Stream original)\n        : base(original)\n    { }\n    #endregion Constructors\n\n    /// <exception cref=\"System.ArgumentNullException\" />\n    /// <exception cref=\"System.ArgumentException\" />\n    internal override void MergeChanges(Stream target)\n    {\n        ArgumentNullException.ThrowIfNull(target);\n\n        if (TempPackage != null)\n        {\n            foreach (PackagePart part in TempPackage.GetParts())\n            {\n                // Ensure that all parts being modified are permitted.\n                if ((part != null) && (!IsValidContentType(part.ContentType)))\n                {\n                    throw new NotSupportedException(SR.PackagePartTypeNotWritable);\n                }\n            }\n\n            base.MergeChanges(target);\n        }\n    }\n\n    /// <summary>\n    /// Creates a new PackagePart.\n    /// </summary>\n    /// <remarks>\n    /// When creating a new PackagePart we must:\n    ///    a) ensure the part does not exist in package\n    ///    b) ensure there is a writable package\n    ///    c) create a temp part\n    ///    d) update active part reference to the temp part\n    /// \n    /// What if a PackagePart with the same Uri already exists?","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationUI/MS/Internal/Documents/Application/RestrictedTransactionalPackage.cs#L36-L72","documentation":"RestrictedTransactionalPackage.MergeChanges scans every part of the temporary package and refuses to merge if any part has a content type not on the allow-list (IsValidContentType). It throws NotSupportedException(SR.PackagePartTypeNotWritable) because a restricted package may only modify permitted part types.","triggerScenarios":"Calling MergeChanges when the temp package contains a part with a disallowed ContentType (e.g., a content type outside the fixed-document whitelist).","commonSituations":"Editing an XPS document and adding non-XPS parts (images/media with unexpected content types); plugins or code inserting arbitrary parts into the temp package.","solutions":["Only add parts whose ContentType passes IsValidContentType before merging","Inspect TempPackage.GetParts() and remove or convert disallowed parts before MergeChanges","Catch NotSupportedException around MergeChanges and report which content type was rejected"],"exampleFix":"// before\npackage.MergeChanges(target);\n// after\nforeach (var part in tempPackage.GetParts())\n    if (!IsValidContentType(part.ContentType))\n        throw new InvalidOperationException(\"Unsupported part: \" + part.ContentType);\npackage.MergeChanges(target);","handlingStrategy":"validation","validationCode":"bool mergeable = tempPackage.GetParts().All(p => p == null || IsValidContentType(p.ContentType)); if (!mergeable) { /* clean up or abort */ }","typeGuard":null,"tryCatchPattern":"try { package.MergeChanges(target); } catch (NotSupportedException ex) { /* report disallowed content type */ }","preventionTips":["Only add whitelisted content types to restricted packages","Audit TempPackage parts before merging","Keep part-creation code aware of package restrictions"],"tags":["wpf","xps-packaging","content-type","restricted-package"],"backgroundTag":"unsupported-operation","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-21T21:30:21.729Z"}