1

クライアントオブジェクトモデルを使用してドキュメントライブラリにファイルを作成するのに問題が発生しています。カスタムVisualStudio2010ワークフローは、ファイルの作成後にファイルのリストアイテムに対して行っている更新を検出しません。

いくつかの可能性のある質問に答えるためのインフラストラクチャのアイデアを提供したいと思います。

  • ドキュメントはWebサービスにアップロードされます。このサービスは、実際にドキュメントをライブラリに挿入し、そのリスト列の値を構成する役割を果たします。
  • Webサービスは、クライアントオブジェクトモデルを使用してこの操作を実行しています
  • Webサービスは、SharePointと対話するときにシステムアカウントとして実行されないビジネスインテリジェンス自動化用に作成されたアカウントを使用して、SharePointサイトに対して認証を行っています。ただし、SharePoint所有者のメンバーです
  • カスタムワークフローの操作は、ファイルのリストアイテムの列に依存してから、それらの列の2つでユーザーにタスクを割り当てることができます。そのため、これら2つの列がnullでなくなるまで、リストアイテムの変更を監視するWhileアクティビティを作成しました。

以下は、Webサービスが実行していることのサンプルです。これは、ビジネスインテリジェンスのユーザーIDで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サービスの操作の直接の結果として到着することはありません。アイテムを手動で変更して、続行することができます。

これらのイベントが正常に発生するのを妨げる可能性のあるクライアントオブジェクトモデルを使用する場合の考慮事項はありますか?

4

1 に答える 1

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

そしてワークフロー自体

ワークフローのスクリーンショット

何か違うことがあれば教えてください。SharePointライブラリで実行されている宣言型ワークフローに問題があり、ほとんどの場合、適切な解決策を見つけることができませんでした。

于 2012-11-20T13:18:06.087 に答える