Вот решение, которое я нашел примерно через неделю:
Убедитесь, что при получении объекта «PublishingWeb» вызовите этот метод PublishingWeb.GetPublishingWeb (SPWeb), который вы передаете в него объект SPWeb, который был полностью получен. В частности, я бы обязательно позвонил в SPSite.OpenWeb на любой веб-сайт следующим образом:
using (SPSite site = new SPSite(folder.ParentWeb.Url))
{
SPWeb web = site.OpenWeb();
PublishingWeb pubWeb = PublishingWeb.GetPublishingWeb(web);
/* work with PublishingWeb here ... */
web.Close();
}
Как только я внес это простое изменение, все ошибки, упомянутые в вопросе, были устранены, независимо от того, в каком контексте я назвал «GetPageLayouts» или «GetAvailablePageLayouts». Документация метода говорит об этом, и это действительно означает:
Используйте этот метод для доступа к поведению PublishingWeb для
экземпляр класса SPWeb, который уже был получен.