Пользовательский рабочий процесс Sharepoint выдает ошибку «Внутренняя ошибка WinWF, завершение рабочего процесса»

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

Вопрос

Недавно я перенес сайт Sharepoint 2010 на Sharepoint 2013, с тех пор мои индивидуальные рабочие процессы, разработанные в Visual Studio, прекрасно работают в течение 2 лет без каких-либо сбоев, внезапно после миграции он начал выдавать это исключение.

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()

Я просмотрел свои коды и увидел, что именно происходит в ApprovalWorkflow.AuthorizeItem(), тогда в этом нет ничего особенного, вот что он делает.

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

По сути, рабочий процесс просто автоматически утверждает элемент на основе определенного условия, которому он соответствует.Затем я вижу в информации о рабочем процессе следующее:

enter image description here

который он выдал ActivityExceutionStatus

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;
}

Обратите внимание, что это происходит не каждый раз при вызове рабочего процесса, это происходит в тех случаях, когда я не знаю, какие триггеры

Есть ли у кого-нибудь идеи, что вызывает это и как предотвратить повторение этого?

Обновление 1. Фактические коды добавлены ниже для ясности.

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;
    }
}
Это было полезно?

Решение 2

Хорошо, похоже, я нашел проблему, и она находится в самом коде, если вы внимательно прочитаете. Надеюсь, это решение поможет кому-то в будущем.

Что произойдет, это то, что рабочий процесс отправляется на несколько петлей, это происходит, когда пользователь обновляет элемент списка, он запускает для запуска рабочего процесса. Далее произойдет, что работник рабочего потока Moderate элемент и установил его в одобренном, это в свою очередь снова вызывает рабочий процесс, то он снова и снова и снова не решит завершить его? (еще не уверен, как, но я замечаю, что он работает только в 10 раз) . То, что я заметил, это то, что SharePoint 2010 работает очень хорошо, но SharePoint 2013 не и бросает и исключение и исключение.

Если вы посмотрите на изображение, он работает в 10 раз (красный выделенный элемент) раньше, но после его исправления я попробовал его дважды, и теперь он работает как ожидалось (синие и зеленые выделенные предметы).

Так что, что исправление для процесса обновления, чтобы снова запускать рабочий процесс, и я сделал это, следуя этому решению: https: / /stackoverflow.com/a/2468156/412519

Затем измените мои обновления в

workflowProperties.Item.Update(true);
.

Введите описание изображения здесь

Другие советы

Я не совсем уверен, применимо ли это к вашему случаю, но если это декларативный рабочий процесс, использующий пользовательское действие, разработанное вами в VS, тогда рабочий процесс будет выполняться с теми же привилегиями, что и инициатор рабочего процесса ( т. е. лицо, добавляющее элемент, подлежащий утверждению).

Вы можете подтвердить это здесь: Декларативные рабочие процессы и пользовательский контекст

Главное, что следует помнить, — это то, что декларативные рабочие процессы (созданные с помощью SharePoint Designer) всегда выполняются от имени пользователя, который запустил рабочий процесс.Итак, если я участник и вношу изменения в элемент списка, и это запускает рабочий процесс, тогда этот рабочий процесс запускается от моего имени и имеет возможность делать все, что я делаю.Это может оказаться затруднительным в тех случаях, когда рабочий процесс пытается сделать что-то, что я не смог сделать самостоятельно, например внести изменения в список, на который у меня нет разрешений, поскольку он имеет те же ограничения, что и я.

Если у пользователя нет разрешения на установку статуса модерации, это приведет к возникновению исключения.Необходимый уровень разрешений: «Утвердить элементы списка» (SPBasePermissions.ApproveItems).Это может объяснить, почему это происходит лишь время от времени.Может быть, при миграции не совсем сохранились права пользователя?Делая удар в темноте, не зная дополнительной информации, но код в вашем AuthorizeItem() функция довольно лаконична.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top