1

我在使用客戶端對象模型在文檔庫中創建文件時遇到困難。我的自定義Visual Studio 2010工作流程未在創建後檢測到我對文件列表項目所做的更新。ListItem從客戶端對象模型更新不觸發OnWorkflowItemChanged活動

我想給基礎設施的想法來回答一些問題可能:

  • 該文件被上傳到Web服務,它負責在圖書館實際插入的文件和配置其列表中的列值
  • 的Web服務使用客戶端對象模型進行交互時
  • Web服務進行身份驗證對SharePoint網站與商業智能自動化創建的帳戶不運行的系統帳戶執行此操作與SharePoint;但它是SharePoint所有者的成員
  • 自定義工作流程中的操作取決於文件的列表項列被填充,然後才能繼續將任務分配給其中兩列中的用戶;因此,我創建了一個While活動來監視列表項中的更改,直到這兩列不再爲空爲止

以下是Web服務正在執行的示例。它以商業智能用戶身份在IIS中運行。我已經添加了一些評論,以說明我預期工作流程的哪些操作會做出適當的響應。

Using client As New ClientContext(My.Settings.SharePointSiteURL) 

    // Pre-processing to determine appropriate user ID values for columns 

    Dim fci As New FileCreationInformation() With { 
     .Content = IO.File.ReadAllBytes(storagePath), 
     .Overwrite = True, 
     .Url = String.Format("{0}/{1}", theList.RootFolder.ServerRelativeUrl, theFileName) 
    } 

    Dim theFile As Microsoft.SharePoint.Client.File = theList.RootFolder.Files.Add(fci) 

    // Expecting the workflow to be activated here 
    client.ExecuteQuery() 

    theFile.ListItemAllFields("Project_x0020_Manager") = pmId 
    theFile.ListItemAllFields("Project_x0020_Accountant") = paId 
    theFile.ListItemAllFields.Update() 

    // Expecting the onWorkflowItemChanged activity to be invoked here 
    client.ExecuteQuery() 
End Using 

工作流確實當一個文件被上傳激活,並繼續在等待來自SharePoint中的變化事件,但該事件從未到達的Web服務的操作的直接結果。我可以手動修改該項目併成功繼續。

使用客戶端對象模型可能會排除這些事件正常觸發時是否需要考慮?

+0

在進入睡眠狀態後工作流是否被觸發,或者問題在於未在此webservice中通過COM設置元數據?如果你有第二個問題,也許這將有助於http://stackoverflow.com/questions/6200654/updated-listitem-attributes-arent-commiting-changes-to-sharepoint? –

+0

COM正確設置列。工作流正在正確啓動。問題是,我使用COM設置的列在我的第一個活動中沒有任何價值,除非在激活之後立即放置一個While循環以等待OnWorkflowItemChanged活動。但是,COM的更新不會觸發該活動,因此工作流不會前進。 – lsuarez

回答

0

看起來像一些奇怪的競爭條件。我能有一些示例代碼部分重現您的問題:

using (var client = new ClientContext(ConfigurationManager.AppSettings["Site"])) 
{ 
    client.Load(client.Site); 
    client.Load(client.Site.RootWeb); 
    var list = client.Site.RootWeb.Lists.GetByTitle("Shared Documents"); 
    client.Load(list); 
    client.Load(list.RootFolder); 
    client.ExecuteQuery(); 
    var fci = new FileCreationInformation() 
       { 
        Content = File.ReadAllBytes(ConfigurationManager.AppSettings["File"]), 
        Overwrite = true, 
        Url = list.RootFolder.ServerRelativeUrl + "/" + "file.xml" 
       }; 
    var file = list.RootFolder.Files.Add(fci); 
    client.ExecuteQuery(); 

    //If following 3 lines are commented out, problem you described may or may not occur. I wasn't able to run into problems, when i loaded file and list item before. 
    //client.Load(file); 
    //client.Load(file.ListItemAllFields); 
    //client.ExecuteQuery(); 

    //Problem also doesn't occur, when i put here 
    //System.Threading.Thread.Sleep(1000); 

    //If code just runs here without delay, sometimes i run into issue you described. 
    var itm = file.ListItemAllFields; 
    itm["SampleColumn"] = "Test content!"; 
    itm.Update(); 
    client.ExecuteQuery(); 
} 

和工作流程:

public Workflow1() 
{ 
    InitializeComponent(); 
} 

public Guid workflowId = default(System.Guid); 
public SPWorkflowActivationProperties workflowProperties = new SPWorkflowActivationProperties(); 

private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e) 
{ 
    var comment = "Workflow started!, item SampleColumn is: " + 
    workflowProperties.Item["SampleColumn"]; 
    SPWorkflow.CreateHistoryEvent(workflowProperties.Web, WorkflowInstanceId, 0, workflowProperties.Web.CurrentUser, new TimeSpan(), "Update", comment, string.Empty); 
} 

private void onWorkflowItemChanged1_Invoked(object sender, ExternalDataEventArgs e) 
{ 
    var comment = "Workflow continous!, item Title is: " +       workflowProperties.Item["SampleColumn"]; 
    SPWorkflow.CreateHistoryEvent(workflowProperties.Web, WorkflowInstanceId, 0, workflowProperties.Web.CurrentUser, new TimeSpan(), "Update", comment, string.Empty); 
} 

和工作流程本身

Workflow screenshot

如果你有一些不同的東西,請讓我知道。我在自己的SharePoint庫上運行的聲明性工作流中遇到了一些問題,大部分時間我都無法找到很好的解決方案。

+0

這與我所用的構造類型實際上是一樣的。唯一的區別是,我的工作流中的onWorkflowItemChanged被放置在While活動中,只是爲了徹底,並確保工作流程不會繼續,直到我檢測到的更改顯示項目經理和項目會計師列不爲空。奇怪的是,雖然沒有檢測到更改事件,但如果我嘗試創建任務並將它們分配給這些列中的用戶而不等待更改事件,那麼這些列也可以爲空。比賽結果永遠不會相同。 – lsuarez

+0

我收到了其他消息來源的類似反饋,說這是一個可能的競爭條件,不一定只能由微軟以外的任何人解決。我會將我的數據庫邏輯移入工作流本身,以確保它的行爲,而不是希望等待比賽。去標記這個答案。 – lsuarez

相關問題