Fler workflow problem (DehydrateInstance: System.Runtime.Serialization.SerializationException)

by Robin Persson 2. March 2010 14:09

Om du någon gång har tänkt återanvända Sharepoint objekt som till exempel SPListItem eller SPUser i ditt workflow så tänk om.

Nämligen så genererar detta följande fel som återfinns i Sharepoint loggen: DehydrateInstance: System.Runtime.Serialization.SerializationException. För att undvika detta måste du återhämta dina objekt i varje workflowmetod eller undersöka möjligheten att inte använda Sharepoint objekt globalt.

Lite läsning:

http://blogs.msdn.com/sharepoint/archive/2006/11/28/developing-workflows-in-vs-part-5-code-your-workflow.aspx

This task is currently locked by a running workflow

by Robin Persson 4. February 2010 11:20

Detta problem brottades jag med en hel del nyligen.

"Workflowet" jag skapade fungerade så att den skapade en "approve/reject task" och beroende på svar från "approvern" så skapades ytterligare en "task". När denna andra "task" skulle godkännas så exkverades inte koden som den skulle. Den körde aldrig metoder som t.ex. OnTask_Changed och inga ändringar registrerades. När man sen öppnade samma "task" igen så inträffade följande: "This task is currently locked by a running workflow". Efter en hel del klurande, googlande och "trial & error" löste jag det genom att sätta ett nytt "task ID" på varje "task" som skapades via "workflowet".

task.TaskId = Guid.newGuid()

Vissa personer har löst detta problem på andra sätt genom att ta bort låset som "workflowet" sätter. Men jag är rädd för att det inte är en långsiktig lösning. 

Så kom ihåg: Alla "tasks" som skapas i ett workflow ska i kod få ett unikt id!

Sätt rättigheter på SPListitem via Workflow

by Robin Persson 14. January 2010 22:40

En kund jag arbetade för hade som krav att dokument i en lista på en Sharepoint 2007 enbart skulle få ses av personer från ett visst land och personer från en viss region.

Problemet var att de inte hade denna information på användarnas konton i deras AD.

Landskod samt regionskod sparades som metadata på dokumentet. Till en början var jag inne på att ange landskod och regionskod i fält på användarnas User Profiles i Sharepoint, samt att senare filtrera listan med hjälp av en "Current User Webpart".

Problemet som uppstod då var att man inte kunde filtrera en lista med multipla värden (en användare kunde tillhöra flera länder), samt att man heller inte kunde filtrera på landskod och regionskod samtidigt.

En nackdel med denna lösning var att du inte heller fick full säkerhet då du enbart filtrerade listan (du angav aldrig några rättigheter på dokumenten).

 

Istället skapade jag upp grupper i Sharepoint för varje land och region. Lade in rätt användare i tillhörande grupp (gjorde detta snabbt via en Console app, skulle också kunna ha använt Power Shell vilket kanske är att rekommendera).

Tanken var att jag skulle skapa en event receiver att lägga på dokumentbiblioteket men tidigare hade jag skapat ett skräddarsytt approval workflow som till samma bibliotek.

Så istället för att skapa en ny feature så lade jag in funktionaliteten i workflowet, så att när workflowet initierades tog den bort rättigheterna för de länder och regioner (grupperna jag skapade) som inte fanns med som metadata på dokumentet i fråga.

Alla länder och regioner fanns i en lista på siten så jag gick igenom listan och och matchade lanskod samt regionskod mot grupperna i Sharepoint och tog bort rättigheter för gruppen på dokumentet, men inte för det land och region som angetts som metadata på dokumentet.

private void SetListItemPermission()
{
        string currentCountry = workflowProperties.Item["Country"].ToString();
        string currentRegion = workflowProperties.Item["Region"].ToString();

        SPList countryList = workflowProperties.Web.Lists["TheCountryAndRegionList"];
        workflowProperties.Item.BreakRoleInheritance(true);
        string newRegion = string.Empty;
        foreach (SPListItem item in countryList.Items)
        {
            string country = item["Country"].ToString();
            string region = item["Region"].ToString();
            if (country != currentCountry)
            {
                    if (workflowProperties.Web.SiteGroups.GetCollection(new String[] { country }).Count > 0)
                    {
                        SPPrincipal spp = (SPPrincipal)workflowProperties.Web.Groups[country];
                        workflowProperties.Item.RoleAssignments.Remove(spp);
                    }

                    if (newRegion != region && region != currentRegion)
                    {
                        newRegion = region;
                        if (workflowProperties.Web.SiteGroups.GetCollection(new String[] { "Region" + region }).Count > 0)
                        {
                            SPPrincipal spp = (SPPrincipal)workflowProperties.Web.Groups["Region" + region];
                            workflowProperties.Item.RoleAssignments.Remove(spp);
                        }
                    }
            }
}

Glöm ej ange BreakRoleInheritance(true) på dokumentet så det ej ärver rättigheter från listan det existerar i.

Vad är detta?

Detta är en blogg av Robin & Robert om främst allt inom och runt omkring Sharepoint 2010 & Sharepoint 2007, men även en hel del annat när det kommer till utveckling och IT.

Senaste Kommentarerna

Comment RSS