Errore di interruzione del flusso di lavoro di SharePoint personalizzato "Errore interno WinWF, Flusso di lavoro di terminazione"

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/81321

Domanda

Ho recentemente migrato un sito di SharePoint 2010 in SharePoint 2013, da quando i miei flussi di lavoro personalizzati sono stati sviluppati in Visual Studio che funziona perfettamente per 2 anni senza problemi all'improvviso dopo la migrazione ha iniziato a lanciare questa eccezione.

w3wp.exe (0x4D3C)                           0x10F0  SharePoint Foundation           Legacy Workflow Infrastructure  88xr    Unexpected
WinWF Internal Error, terminating workflow Id# 21492445-9c27-479c-ae16-5d0d3ae84b69 

w3wp.exe (0x4D3C)                           0x10F0  SharePoint Foundation           Legacy Workflow Infrastructure  98d4    Unexpected
Microsoft.SharePoint.SPException: Cannot complete this action.  Please try again. ---> System.Runtime.InteropServices.COMException: Cannot complete this action.  
Please try again.<nativehr>0x80004005</nativehr><nativestack></nativestack>     
at Microsoft.SharePoint.Library.SPRequestInternalClass.AddOrUpdateItem(String bstrUrl, String bstrListName, Boolean bAdd, Boolean bSystemUpdate, Boolean bPreserveItemVersion, Boolean bPreserveItemUIVersion, Boolean bUpdateNoVersion, Int32& plID, String& pbstrGuid, Guid pbstrNewDocId, Boolean bHasNewDocId, String bstrVersion, Object& pvarAttachmentNames, Object& pvarAttachmentContents, Object& pvarProperties, Boolean bCheckOut, Boolean bCheckin, Boolean bUnRestrictedUpdateInProgress, Boolean bMigration, Boolean bPublish, String bstrFileName, ISP2DSafeArrayWriter pListDataValidationCallback, ISP2DSafeArrayWriter pRestrictInsertCallback, ISP2DSafeArrayWriter pUniqueFieldCallback)     
at Microsoft.SharePoint.Library.SPRequest.AddOrUpdateItem(String bstrUrl, String bstrListName, Boolean bAdd, Boolean bSystemUpdate, Boolean bPreserveItemVersion, Boolean bPreserveItemUIVersion, Boolean bUpdateNoVersion, Int32& plID, String& pbstrGuid, Guid pbstrNewDocId, Boolean bHasNewDocId, String bstrVersion, Object& pvarAttachmentNames, Object& pvarAttachmentContents, Object& pvarProperties, Boolean bCheckOut, Boolean bCheckin, Boolean bUnRestrictedUpdateInProgress, Boolean bMigration, Boolean bPublish, String bstrFileName, ISP2DSafeArrayWriter pListDataValidationCallback, ISP2DSafeArrayWriter pRestrictInsertCallback, ISP2DSafeArrayWriter pUniqueFieldCallback)     
--- End of inner exception stack trace ---     
at Microsoft.SharePoint.SPGlobal.HandleComException(COMException comEx)     
at Microsoft.SharePoint.Library.SPRequest.AddOrUpdateItem(String bstrUrl, String bstrListName, Boolean bAdd, Boolean bSystemUpdate, Boolean bPreserveItemVersion, Boolean bPreserveItemUIVersion, Boolean bUpdateNoVersion, Int32& plID, String& pbstrGuid, Guid pbstrNewDocId, Boolean bHasNewDocId, String bstrVersion, Object& pvarAttachmentNames, Object& pvarAttachmentContents, Object& pvarProperties, Boolean bCheckOut, Boolean bCheckin, Boolean bUnRestrictedUpdateInProgress, Boolean bMigration, Boolean bPublish, String bstrFileName, ISP2DSafeArrayWriter pListDataValidationCallback, ISP2DSafeArrayWriter pRestrictInsertCallback, ISP2DSafeArrayWriter pUniqueFieldCallback)     
at Microsoft.SharePoint.SPListItem.AddOrUpdateItem(Boolean bAdd, Boolean bSystem, Boolean bPreserveItemVersion, Boolean bNoVersion, Boolean bMigration, Boolean bPublish, Boolean bCheckOut, Boolean bCheckin, Guid newGuidOnAdd, Int32& ulID, Object& objAttachmentNames, Object& objAttachmentContents, Boolean suppressAfterEvents, String filename, Boolean bPreserveItemUIVersion)     
at Microsoft.SharePoint.SPListItem.UpdateInternal(Boolean bSystem, Boolean bPreserveItemVersion, Guid newGuidOnAdd, Boolean bMigration, Boolean bPublish, Boolean bNoVersion, Boolean bCheckOut, Boolean bCheckin, Boolean suppressAfterEvents, String filename, Boolean bPreserveItemUIVersion)     
at Microsoft.SharePoint.SPListItem.Update()     
at ProductList.AutoApprovalProcess.ApprovalWorkflow.AuthorizeItem()     
at ProductList.AutoApprovalProcess.ApprovalWorkflow.onWorkflowActivated1_Invoked(Object sender, ExternalDataEventArgs e)     
at System.Workflow.ComponentModel.Activity.RaiseGenericEvent[T](DependencyProperty dependencyEvent, Object sender, T e)     
at System.Workflow.Activities.HandleExternalEventActivity.RaiseEvent(Object[] args)     
at System.Workflow.Activities.HandleExternalEventActivity.Execute(ActivityExecutionContext executionContext)     
at System.Workflow.ComponentModel.ActivityExecutor`1.Execute(T activity, ActivityExecutionContext executionContext)     
at System.Workflow.ComponentModel.ActivityExecutorOperation.Run(IWorkflowCoreRuntime workflowCoreRuntime)     
at System.Workflow.Runtime.Scheduler.Run()
.

Ho guardato i miei codici e guarda cosa succede esattamente su Approvalworkflow.Authorizeitem () Quindi non è niente di veramente fantasia, ecco cosa fa

private void AuthorizeItem()
{
    workflowProperties.Item.ModerationInformation.Status = SPModerationStatusType.Approved;
    workflowProperties.Item.Update();
}
.

Fondamentalmente il flusso di lavoro è appena aumentato l'articolo in base a una determinata condizione che si incontra. Quello che vedo solo nelle informazioni del flusso di lavoro è questo

Inserire l'immagine Descrizione qui

che ha gettato da attivitàExceutitionstatus

protected override ActivityExecutionStatus HandleFault(ActivityExecutionContext executionContext, Exception exception)
{
    ((ISharePointService)executionContext.GetService(typeof(ISharePointService))).LogToHistoryList(base.WorkflowInstanceId, SPWorkflowHistoryEventType.WorkflowComment, 0, TimeSpan.MinValue, string.Empty, string.Format("WorkFlow Exception!: {0}", exception.Message), string.Empty);
    return ActivityExecutionStatus.Closed;
}
.

Prendi nota Questo non accadrà ogni volta che il flusso di lavoro è invocato, succede in occasioni non so cosa trigger

Qualcuno ha un'idea che cosa provoca questo e come impedire che si verifichi di nuovo?

Aggiorna 1 Codici effettivi aggiunti di seguito per chiarezza

public Guid workflowId = default(System.Guid);
public SPWorkflowActivationProperties workflowProperties = new SPWorkflowActivationProperties();
pblic enum ThresholdItem { MultipleThreshold, NoThreshold, BelowThreshold, AboveThreshold, Valid };

private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
{
    switch (ThresholdCheck())
    {
        case ThresholdItem.Valid:
            AuthorizeItem();
            break;
        case ThresholdItem.BelowThreshold:
            RequestDenied("Below Threshold");
            break;
        case ThresholdItem.AboveThreshold:
            RequestDenied("Above Threshold");
            break;
        case ThresholdItem.NoThreshold:
            RequestDenied("No Threshold Defined");
            break;
        case ThresholdItem.MultipleThreshold:
            RequestDenied("Multiple Threshold Defined");
            break;
    }
}   


private ThresholdItem ThresholdCheck()
{
    SPLinqDataContext dc = new SPLinqDataContext(workflowProperties.SiteUrl + "/Testing");

    EntityList<ThresholdsItem> PriceThreshold = dc.GetList<ThresholdsItem>("Thresholds");

    string destination = GetLinkedListItemString(workflowProperties.Item["Destination"].ToString());
    string origin = GetLinkedListItemString(workflowProperties.Item["Origin"].ToString());
    double price = double.Parse(workflowProperties.Item["Price"].ToString());

    var Result = (from p in Threshold
                    where
                        p.Destination.Title == destination &&
                        p.Origin.Title == origin
                    select p);
    switch (Result.Count())
    {
        case 1:
            var SingleResult = Result.SingleOrDefault();
            if (SingleResult.MinPrice > price)
                return ThresholdItem.BelowThreshold;
            else if (SingleResult.MaxPrice < price)
                return ThresholdItem.AboveThreshold;
            else
                return ThresholdItem.Valid;
        case 0:
            return ThresholdItem.NoThreshold;

        default:
            return ThresholdItem.MultipleThreshold;

    }
}

private void RequestDenied(string note)
{
    workflowProperties.Item.ModerationInformation.Status = SPModerationStatusType.Denied;
    workflowProperties.Item.ModerationInformation.Comment = note;
    workflowProperties.Item.Update();
}

private string GetLinkedListItemString(string item)
{
    if (item.Contains("#"))
    {
        return sItem.Substring(item.LastIndexOf("#") + 1);
    }
    else
    {
        return item;
    }
}
.

È stato utile?

Soluzione 2

OK Sembra che abbia trovato il problema ed è nel codice stesso se lo leggi da vicino. Speriamo che questa soluzione aiutino qualcuno in futuro.

Cosa succede è che il flusso di lavoro vada su un ciclo multiplo, questo accade quando l'utente aggiorna la voce dell'elenco, si attiva per eseguire il flusso di lavoro. Ciò che succede è che il thread del workflow del flusso di lavoro modera l'oggetto e lo configura su Approvato, questo a turno innesca nuovamente il flusso di lavoro, poi va ancora e ancora fino a quando SharePoint decide di terminarlo? (Non è ancora sicuro come ma ho notato che funziona solo 10 volte) . Quello che ho notato è che SharePoint 2010 la gestisce molto bene, ma SharePoint 2013 non è e getta e un'eccezione una volta ogni tanto.

Se si guarda all'immagine esegui 10 volte (l'elemento rosso evidenziato) prima ma dopo averlo fissato, l'ho provato due volte e ora funziona come previsto (gli oggetti blu e verdi evidenziati).

Quindi qual è la correzione per il processo di aggiornamento per non attivare nuovamente il flusso di lavoro e l'avevo fatto a seguito di questa soluzione: https: / /stackoverflow.com/a/2468156/412519

Quindi modificare i miei aggiornamenti su

workflowProperties.Item.Update(true);
.

Inserire l'immagine Descrizione qui

Altri suggerimenti

Non sono sicuro che questo si applica al tuo caso, ma se questo è un flusso di lavoro dichiarativo che utilizza un'attività personalizzata che hai sviluppato in VS, allora il flusso di lavoro verrà eseguito sotto gli stessi privilegi dell'iniziatore di Il flusso di lavoro (cioè la persona che aggiunge l'oggetto da approvare).

Puoi convalidare questo qui: Flussi di lavoro dichiarativi e contesto utente

.

La cosa di base da ricordare è che i flussi di lavoro dichiarativi (il proprio creato da SharePoint Designer) esegue sempre impersonare l'utente che ha avviato il flusso di lavoro. Quindi se sono un contributore e faccio una modifica a un elemento di elenco e che innesca un flusso di lavoro allora quel flusso di lavoro funziona come me e ha la capacità di fare tutto ciò che faccio. Dove questo può ottenere impegnativo è nei casi in cui il flusso di lavoro cerca di fare qualcosa che non potevo fare da solo, come fare un passaggio a un elenco che non ho permessi, poiché ha anche le stesse limitazioni che faccio. < / P >.

Se l'utente non ha il permesso di impostare lo stato di moderazione, ciò avrebbe un'eccezione. Il livello di autorizzazione necessario è "Approva elementi elenco" ( spbasepermissions.approveitems ). Questo potrebbe spiegare perché si verifica solo una parte del tempo. Forse le autorizzazioni dell'utente non erano abbastanza conservate nella migrazione? Prendendo una pugnalata al buio senza conoscere ulteriori informazioni, ma il codice nella tua funzione AuthorizeItem() è piuttosto succinto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top