Polecam

.NET Blogs PL
CodeGuru


Tips & Tricks 11: ErrorWebPart podczas próby pobrania ContentEditorWebPart

March 27, 2009 in categories: pro by Gutek

3

Ostatnio musiałem napisać na szybko kod, który miał przechodzić po wszystkich WebPartach na stronie i sprawdzić czy linki w nich zawarte prowadzą do poprawnego serwera. To co myślałem, że będzie proste okazało się zmorą programisty :) Dlatego też chciałbym się tym tutaj podzielić byście przypadkiem też się zbędnie z czymś takim nie męczyli :)

Otworzyłem sobie VS i stworzyłem projekt Command Line, w którym napisałem funkcje, której fragment wyglądającą mniej więcej tak:

SPSecurity.RunWithElevatedPrivileges
(
    delegate()
    {
        using (SPSite site = new SPSite(uniqueSiteId))
        {
            using (SPWeb web = site.OpenWeb(uniqueWebId))
            {
                using(SPLimitedWebPartManager manager = web.GetLimitedWebPartManager("default.aspx", PersonalizationScope.Shared))
                {
                    foreach(WebPart wp in manager.WebParts)
                    {
                        if(wp is ContentEditorWebPart)
                        {
                            ContentEditorWebPart cedwp = wp as ContentEditorWebPart;
                            // do some work
                            manager.SaveChanges(cedwp);
                        }
 
                        wp.Dispose();
                    }
                }
            }
        }
    }
);

I wszystko byłoby pięknie gdyby to mi zadziałało :) To znaczy, program wykonał się poprawnie i zakończył sukcesem, jednak zmian na stronie nie mogłem zaobserwować. Pomyślałem, że może jednak coś źle robię – szybkie wyszukiwanie w Google powiedziało, iż dobrze robię, a więc co mogło być nie tak?

Podłączyłem się debugerem pod kod by zobaczyć co jest nie tak. Okazało się, że mój wp jest zawsze ErrorWebPart i niczym innym. Zapytanie:

web.GetLimitedWebPartManager("default.aspx", PersonalizationScope.Shared).WebParts[0]

w oknie Immediate, zwracało:

A first chance exception of type 'Microsoft.SharePoint.WebPartPages.WebPartPageUserException' occurred in Microsoft.SharePoint.dll

a następnie wypisywało wszystkie informacje na temat ErrorWebPart. Skoro zwracało mi taki błąd, do zagłębiłem się w właściwości tego WebPart by odkryć własnośći ErrorType i ErrorText, które kolejno zwracały:

Error Type

---

Microsoft.SharePoint.WebPartPages.ErrorType.Unsafe

Error Text

---

This page has encountered a critical error. Contact your system administrator if this problem persists.

Zagłębienie się w Inner Exceptions dało mi za to taki wynik:

_COMPlusExceptionCode = -532459699

Tutaj już Google, zabardzo nie pomógł ;) Zaś nie chciało mi się już bardziej dociekać dlaczego się tak dzieję, choć zapewne dzięki WinDbg byłbym wstanie dowiedzieć się więcej.

Cofnąłem się więc do błędu z okna Immediate i w Google znalazłem informację taką iż SharePoint nie zezwala mi na dostęp do WebPart do póki:

  1. Web Part do którego chcę się dostać nie jest uznany za Safe;
  2. Mój kod nie jest uznany za Safe.

Biorąc pod uwagę te dwie wiadomości, zamieniłem swój kod na DLL Library a następnie podpisałem je i wrzuciłem do GAC. Do kodu dodałem jeszcze stronkę na której umieściłem przycisk Run i boom :) kod zadziałał :)

Widać nie wszystkie zabezpieczenia w SharePoint są złe ;) to po jakimś czasie mi się nawet spodobało, gdyż wiem iż Administrator za pomocą „brzydkiego programu” nie zrobi krzywdy WebPartom (ukłon w stronę Justyny ;)). Oczywiście dojście do rozwiązania trochę zajęło a błąd nie był jasny - ten Unsafe mógł nakierować, ale nie do tego stopnia, że bym stworzył stronę a DLL wrzucił do GAC :)

Może nowa wersja będzie miała… lepsze opisy błędów ;)




 

 

 

3 comments for "Tips & Tricks 11: ErrorWebPart podczas próby pobrania ContentEditorWebPart"

  1. can_do
    can_do Says:

    Ojej, jestem w kosmosie Wink
    Pozdrówki

  2. Waldek Mastykarz
    Waldek Mastykarz Says:

    Jestes pewien, ze ten blad jest spowodowany roznica Console App/Class Lib a nie brakiem SPContext?

  3. Gutek
    Gutek Says:

    @Waldek

    moze sie zle wyrazilem, chodzilo wlasnie o osadzenie kodu w SharePoint, mozliwe ze wlasnie z tego powodu by posiadal on SPContext, ale na przyklad jezeli WebPart nie jest uznany za Safe w SharePoint i ma dostep do SPContext to SharePoint moze Ci zwrocic ErrorWebPart.

    Czyli chyba nie tylko SPContext tutaj jest "kluczem" ale takze zabezpieczenia kodu i Security Attributes zezwalajace na korzystanie z okreslonych elementow SharePoint w zaleznosci od kontekstu uruchomienia.

    Ale tak jak powiedzialem, nie analizowalem tego do konca, wiec moge sie momentami mylic Smile

    Gutek

Comments are closed

© 2008-2010 Jakub Gutkowski. Powered by BlogEngine.NET 1.5.1.14. Hosted on OrcsWeb.

Design