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

Я получаю сообщение об ошибке при попытке изменить страницу на сайте 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 ]

2 голосов
/ 26 августа 2009

Стоп! Медленно отойдите от SQL Server;)

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

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

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

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

0 голосов
/ 01 июля 2010

Используя отражатель, я обнаружил, что они генерируют 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. Удачи. У меня та же проблема. Я планирую удалять один элемент управления за раз, пока не определю, какой именно.

0 голосов
/ 25 августа 2009

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

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

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

...