SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Anfügen eines Workflow an eine Liste in c#

Unbeantwortet Dieser Beitrag hat 10 Antworten

Ohne Rang
42 Beiträge
Schmidt Mathias erstellt 20 Aug. 2015 08:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

In meiner Farmlösung versuche ich einen Workflow einer Liste zuzuordnen. Leider bekomme ich als Exception

 

"Aktualisierungen von GET-Abfragen sind momentan untersagt. Legen Sie bitte die  AllowUnsafeUpdates-Eigenschaft von SPWeb fest, um Aktualisierungen für GET-Abfragen zuzulassen."} System.Exception {Microsoft.SharePoint.SPException"

obwohl die AllowUnsafeUpdate auf true steht.
Quellcode
 SPWorkflowManager workflowManager = myWeb.Site.WorkflowManager;

                            SPWorkflowTemplateCollection templates = workflowManager.GetWorkflowTemplatesByCategory(myWeb, null);

                            SPWorkflowTemplate template =  site.RootWeb.WorkflowTemplates.GetTemplateByBaseID(new Guid("WorkflowtemplateID"));
                            SPWorkflowAssociation association = SPWorkflowAssociation.CreateListAssociation(template, "Workflowname", taskList, historyList);
                            association.AllowManual = true;
                            association.AutoStartCreate = true;
                            myWeb.AllowUnsafeUpdates = true;
                            myWeb.Update();

                            try
                            {
                                myWeb.Lists["Listenname"].WorkflowAssociations.Add(association);
                            }
                            catch(SPException ex)
                            {
                             
                            }

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 20 Aug. 2015 09:03
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Setze AllowUnsafeUpdates als allererstes auf true. Und vor allem mache das auch für myWeb.Site.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
42 Beiträge
Schmidt Mathias Als Antwort am 20 Aug. 2015 09:18
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hebe ich jetzt beides gemacht. Leider bekomme ich immer noch die gleiche Fehlermeldung.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 20 Aug. 2015 10:50
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Dann hast Du noch andere SPWeb oder SPSite-Instanzen und bei denen ist das nicht gesetzt. Dein Codeausschnitt zeigt z.B. nicht wo tasklist und historylist herkommen. Diese Fehlermeldung ist jedenfalls sehr eindeutig und ich habe bei der noch nicht erlebt, daß sie falsch ausgegeben wird (bei anderen schon).

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
42 Beiträge
Schmidt Mathias Als Antwort am 20 Aug. 2015 13:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Nein habe auf alle Instanzen die ich nutze ein AllowUnsafeUpdate true gesetzt.

Das Anlegen der Liste in der Unterseite, das Erstellen der Navigation sowie das laden des Workflowtemplates funktionieren. Nur das Zuordnen des Workflows zu der Liste bringt den Fehler.

hier mal ein größerer Quellecodeausschnitt

 

 

            string items = Request["Items"];

 

            SPList list = null;

 

            SPSecurity.RunWithElevatedPrivileges(() =>

            {

                using (SPSite site = new SPSite(Request["Source"]))

                {

                    site.AllowUnsafeUpdates = true;

                    using (SPWeb web = site.OpenWeb())

                    {

                        web.AllowUnsafeUpdates = true;

                        web.Site.AllowUnsafeUpdates = true;

                        web.Update();

                        list = web.Lists[new Guid(Request["ListId"])];

                        SPListItem listItem = list.GetItemById(Int32.Parse(items));

                        String ProjektURL = listItem["Projekt"].ToString();

 

                        String[] Projekt = ProjektURL.Split(',');

 

                        SPWeb myWeb = site.OpenWeb(Projekt[0].Replace(Site.Url.ToString(),""));

                        myWeb.AllowUnsafeUpdates = true;

                        myWeb.Site.AllowUnsafeUpdates = true;

                        myWeb.Update();

 

                        SPListCollection myListCollection = myWeb.Lists;

                        SPListTemplate myTemplate = myWeb.ListTemplates["Projekte"];

                        myWeb.Update();

                        SPList registrationList = null;

                        if (myListCollection.TryGetList("Projekte") == null)

                        {

                            myListCollection.Add("Projekte", "Liste für Projekte", myTemplate);

                            registrationList = myWeb.Lists["Projekte"];

                            SPNavigationNode listNode = new SPNavigationNode(registrationList.Title, registrationList.DefaultViewUrl);

                            myWeb.Navigation.AddToQuickLaunch(listNode, SPQuickLaunchHeading.Lists);

                        }

                        else

                        {

                            registrationList = myWeb.Lists["Projekte"];

                        }

 

 

 

                        SPList taskList = myWeb.Lists["Tasks"];

                        SPList historyList = myWeb.Lists["Workflow History"];

 

 

                        SPWorkflowAssociation existingAssociation = registrationList.WorkflowAssociations.GetAssociationByName(myWeb.WorkflowTemplates.GetTemplateByBaseID(new Guid("a668de7f-3793-4294-99da-3bddb5f7130c")).Name, CultureInfo.CurrentCulture);

                        if (existingAssociation == null)

                        {

 

 

                            SPWorkflowManager workflowManager = myWeb.Site.WorkflowManager;

                            SPWorkflowTemplateCollection templates = workflowManager.GetWorkflowTemplatesByCategory(myWeb, null);

                            SPWorkflowTemplate template =  site.RootWeb.WorkflowTemplates.GetTemplateByBaseID(new Guid("a668de7f-3793-4294-99da-3bddb5f7130c"));

                            SPWorkflowAssociation association = SPWorkflowAssociation.CreateListAssociation(template, "ProjektWebseite", taskList, historyList);

                            association.AllowManual = true;

                            association.AutoStartCreate = true;

 

 

                            try

                            {

 

                                myWeb.Lists["Projekte"].WorkflowAssociations.Add(association);

                            }

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 20 Aug. 2015 15:15
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Also auf die Schnelle kann ich da nichts erkennen, außer

[quote user="Mathias Schmidt"]SPWorkflowTemplate template =  site.RootWeb.WorkflowTemplates.GetTemplateByBaseID(...)[/quote]

site.RootWeb hast Du evtl. ausgelassen.

Ansonsten wird Dir wohl nur intensives Debugging weiterhelfen. Wo läuft denn der Code und in welcher Zeile tritt der Fehler auf?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
42 Beiträge
Schmidt Mathias Als Antwort am 20 Aug. 2015 16:26
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

in meinem Fall ist die Variable web eigentlich gleich der Site.rootweb.  Ich habe es versuchsweise trotzdem eingefügt. der Effekt ist leider der selbe.  Der Fehler tritt beim Aufruf von 

myWeb.Lists["Projekte"].WorkflowAssociations.Add(association);

 

auf. Eine Haltepunkt hatte ich im VS auch schon gesetzt und debug angestoßen. Leider brauchte dies auch keinen Erfolg. Alle ersichtlichen AllowUnsafeUpdate-Eigenschaften stehen auf true.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 20 Aug. 2015 16:41
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Mhm, OK. Offenbar wird da irgendwo intern noch ein anderes Web benutzt. Was sagt denn der StackTrace der Exception dazu? Gibt es da einen Hinweis? Sonst kannst Du auch mal Verbose-Logging aktivieren und dann in den Logs forschen.

Und nochmal die Frage, wo der Code läuft bzw. laufen soll. Kann man das evtl. passend umstellen, so daß die Änderungen während eines POST erfolgen?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
42 Beiträge
Schmidt Mathias Als Antwort am 21 Aug. 2015 14:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Die Fuktionnalität ist so:

Es gibt eine Liste mit Elementen. Jedes Element hat eine Unterwebseite. Nach Auswahl eines Elements in der Liste und Bestätigung über einen Button in der Ribbon(ModalDialog),wird eine aspx-Seite gestartet, welche auf der jeweiligen Unterseite eine Liste nach Vorlage erstellt und dieser Berechtigungen und einen Workflow zuweist. Das mit dem Erstellen und Das Setzen der Berechtigungen klappt auch nur das Zuweisen des Workflow liefert den Fehler.  

Gibt es eine Möglichkeit Modaldialog Parameter per Post zu übergeben und diese in einer aspx(Code-Behind) zu nutzen? 

 

Die Ausgabe des Stack hat mir auch nicht wirklich weitergeholfen.

bei Microsoft.SharePoint.SPGlobal.HandleComException(COMException comEx) bei Microsoft.SharePoint.Library.SPRequest.RegisterEventReceiver(String bstrUrl, String bstrListName, EventReceiverOperation operation, Guid guidId, String bstrName, Guid guidSiteId, Guid guidWebId, Guid guidHostId, Int32 dwHostType, Int32 dwSynchronization, Int32 dwType, Int32 dwSequenceNumber, String bstrRemoteUrl, String bstrAssembly, String bstrClass, Guid solutionId, String bstrData, String bstrFilter, Int32 dwCredential, Guid contextObjectId, Guid contextType, Guid contextEventType, Guid contextId, Guid contextCollectionId) bei Microsoft.SharePoint.SPEventReceiverDefinition.RegisterForSiteOrWebOrList(Operation operation, Boolean isMigration) bei Microsoft.SharePoint.SPEventReceiverDefinition.Register(Operation operation, Boolean isMigration) bei Microsoft.SharePoint.Workflow.SPWorkflowManager.CreateListSubscription(SPList listElev, Type handlerClass, SPEventReceiverType rt, String filter, String strData) bei Microsoft.SharePoint.Workflow.SPWorkflowManager.<>c__DisplayClass3a.b__37() bei Microsoft.SharePoint.SPSecurity.<>c__DisplayClass5.b__3() bei Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode) bei Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback secureCode, Object param) bei Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode) bei Microsoft.SharePoint.Workflow.SPWorkflowManager.AddAutoStartToList(SPList list, Boolean bCreate, Boolean bChange) bei Microsoft.SharePoint.Workflow.SPWorkflowAssociationCollection.AddCore(SPWorkflowAssociation wa, Guid id, SPList list, Boolean forceUtilityListCreation) bei Microsoft.SharePoint.Workflow.SPListWorkflowAssociationCollection.Add(SPWorkflowAssociation workflowAssociation) bei MultiProject.Layouts.MultiProject.CreateMultiProjekt.<>c__DisplayClass1.b__0() 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 21 Aug. 2015 15:05
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Der StackTrace besagt immerhin, daß der Fehler beim Hinzufügen der EventReceiver für den Workflow (für den automatischen Start bei Neuanlage) auftritt. Dieser Code läuft intern offenbar unter SPSecurity.RunWithElevatedPriviledges und aus irgendeinem Grund wird bei den dort erzeugten SPWeb-Instanzen AllowUnsafeUpdates nicht auf true gesetzt. Dafür gibt es wohl irgendwelche Bedingungen. In den meisten Fällen funktioniert der Code ja.

[quote user="Schmidt Mathias"]Bestätigung über einen Button in der Ribbon(ModalDialog),wird eine aspx-Seite gestartet[/quote]

Warum setzt Du den Code nicht einfach hinter diesen Button? Der Button löst einen POST aus und Du bist alle Probleme mit den UnsafeUpdates los.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
42 Beiträge
Schmidt Mathias Als Antwort am 23 Aug. 2015 18:40
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hab es auf POST umgebaut. Jetzt funktioniert es. Wollte den Programmieraufwand eigentlich so gering wie möglich halten. Schade das GET nicht funktioniert (Grund erschließt sich mir nur bedingt).