Как определить небезопасную веб-часть / элемент управления

Я получаю сообщение об ошибке при попытке изменить страницу на сайте SharePoint. Используя WinDbg, я вижу, что фактическая ошибка:

Microsoft.SharePoint.ApplicationRuntime.SafeControls + UnsafeControlException

Мне кажется, что у меня есть элемент управления на странице, который не включен в раздел файла web.config. Я посмотрел на файл aspx для страницы, но я не вижу там никаких элементов управления, на которые нет ссылки в web.config.

Копаясь немного глубже (и используя Sosex.dll), я получил следующие данные из стека вызовов, которые привели к ошибке:

0:013> !mframe 03
0:013> !mdv
Frame 0x3: (Microsoft.SharePoint.ApplicationRuntime.SafeControls.GetTypeFromGuid(System.Guid)):
[A0]:this:0xc00c03e8 (Microsoft.SharePoint.ApplicationRuntime.SafeControls)
[A1]:guid:{ef2d8253-a451-56da-be1d-5f32d5227173} VALTYPE (MT=0000064278430ea8, ADDR=000000000308caa0) (System.Guid)
[L0]:null (System.Type)
[L1]:0x633c50 (System.String) STRVAL=The type could not be found or it is not registered as safe.
[L2]:null (System.Type)

Похоже, я нашел GUID элемента управления ([A1]), который вызывает проблему. Тем не менее, я не знаю, как найти элемент управления, на который ссылается этот GUID. Где-то в SQL Server должна быть таблица, в которой хранится эта информация? Я уже пробовал dbo.WebParts, выбирая tp_ID с GUID, но ничего не нашел. Я предполагаю, что что-то упустил?

3 ответа

Стоп! Медленно отступайте от SQL Server;)

Первое, на что нужно обратить внимание - это разница между закрытой веб-частью и удаленной веб-частью.

Закрыто - операция меню, которую вы получаете, когда не находитесь в "режиме редактирования страницы", и она просто скрывает веб-часть от просмотра - SharePoint все еще пытается загрузить свою сборку, и вы получите ошибки, если нет соответствующей безопасной записи элемента управления.

Если это проблема, то самый простой способ удалить ее - поместить в конце URL-адреса ? Contents = 1, и страница откроется в режиме обслуживания.

Надеюсь это поможет!

Для программного управления веб-частями вы можете использовать SPLimitedWebPartManager

См. Эту статью, чтобы узнать, как бы вы удалили или нашли веб-часть со страницы.

С помощью отладчика должно быть довольно легко перечислить все эти веб-части и просто увидеть основную часть DisplayTitle для вашего конкретного идентификатора.

Используя рефлектор, я обнаружил, что они генерируют GUID для каждого элемента управления:

internal static Guid GetTypeId(MD5HashProvider md5Provider, Type type, string assemblyName)
{
    byte[] bytes = new UnicodeEncoding().GetBytes(assemblyName + "|" + type.FullName);
    return new Guid(md5Provider.GetHash(bytes));
}

Так что, если вы действительно хотите его найти, запустите каждую сборку, наберите и сопоставьте GUID. Удачи. У меня та же проблема. Я планирую удалять один элемент управления за раз, пока я не определю, какой именно.

Другие вопросы по тегам