Как определить небезопасную веб-часть / элемент управления
Я получаю сообщение об ошибке при попытке изменить страницу на сайте SharePoint. Используя WinDbg, я вижу, что фактическая ошибка:
Microsoft.SharePoint.ApplicationRuntime.SafeControls + UnsafeControlException
Мне кажется, что у меня есть элемент управления на странице, который не включен в раздел
Копаясь немного глубже (и используя 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. Удачи. У меня та же проблема. Я планирую удалять один элемент управления за раз, пока я не определю, какой именно.