ワークフローのコンパイル中にエラーが発生しました。

こんにちは。江口です。今回は、SharePoint Online/SharePoint Server 2013 (オンプレミス) で、SharePoint Desinger ワークフロー (SPD ワークフロー) 作成する際のエラーについてご案内します。

 

はじめに

業務フローに合わせて複雑な SPD ワークフローを作成した場合、ワークフロー発行の際に以下のエラーメッセージが表示される場合があります。

 

エラーメッセージ:

  ワークフローのコンパイル中にエラーが発生しました。ワークフロー ファイルは保存されましたが、実行することはできません。

  ワークフローに関連するサーバーで、不明なエラーが発生しました。

このエラーについて、原因と各環境における対処方法を記載します。

 

原因

上記エラーは、下記 2 つの要因に該当する場合に表示されます。

 

要因 1) ワークフローの複雑さ (Workflow Complexity) の制限値を超過している場合

要因 2) ASP.NET の最大実行時間を超過している場合

 

それぞれの要因について以下に詳細を記載します。

 

要因 1) ワークフローの複雑さ (Workflow Complexity) の制限値を超過している場合

SharePoint では、SPWebApplication.UserDefinedWorkflowMaximumComplexity プロパティが用意されており、ワークフローの複雑さに対して制限が設定されています。

 

SPD ワークフローはユーザーが自由に作成できる利便性があります。

しかし、処理が複雑なワークフローを運用した場合、SharePoint 全体のパフォーマンスに影響が及ぶ可能性があります。

そのため、SharePoint では既定の設定で、高負荷な処理がサーバー上で実行され続けた場合の深刻な障害を未然に防ぐ目的で、作成できるワークフローの複雑さに制限を設けています。

なお、ワークフローの複雑さは各ワークフローが対象であり、1 つのワークフローに含まれているアクションの数などによって算出されます。

 

要因 2) ASP.NET の最大実行時間を超過している場合

ワークフローの発行時の処理は、その他の処理に比べて処理に時間が掛かり、ASP.NET の最大実行時間 (executionTimeout) を超過する場合があります。

最大実行時間は既定では110 秒に設定されていますが、ネットワーク環境によってはこの設定時間を超過する場合があります。

上述した原因を踏まえたうえで、下記に各環境における対処方法を記載します。

対処方法 

SharePoint Online 環境における対処方法

作成した SPD ワークフローの構成を見直し、ワークフローの分割や単純化が適切な対処方法です。

 

ワークフローを分割する利点として、ワークフローが失敗した場合などにビジネス プロセスへの影響を抑えるメリットがあります。詳細については、以前の森さんの投稿 (内部エラー (WinWF Internal Error) 発生を想定したSharePoint ワークフローをデザインする) を合わせてご覧ください。

なお、SharePoint Online では、上述した各設定値を変更することができません。

 

SharePoint Server 2013 環境 (オンプレミス) における対処方法

はじめに、上述した SharePoint Online 環境における対処方法と同様に、可能な限り SPD ワークフローの構成を見直すことが望ましい対処方法です。

しかしながら、ユーザーの業務上 1 つのワークフローで行いたいロジックがある場合は、以下の各設定値を変更することで対処できます。

 

それぞれの設定値の変更方法を記載します。

 

注意事項

本プロパティに限らず SharePoint 製品ではパフォーマンスのテストや調整したうえで、各プロパティの既定値を設定していますので、可能な限り既定値のまま利用することを弊社は推奨しています。

しかし、お客様の業務上プロパティの値を変更する必要がある場合は、SharePoint ファーム環境のパフォーマンスへの影響を考慮し、予め十分な検証を実施いただいたうえで変更してください。

 

変更方法 1) ワークフローの複雑さ (Workflow Complexity) の制限値の変更方法

以下の手順にて、特定の Web アプリケーションの SPWebApplication.UserDefinedWorkflowMaximumComplexity プロパティの値を変更することができます。

UserDefinedWorkflowMaximumComplexity プロパティの既定値は 7000 に設定されています。

 

- 手順

  1. SharePoint サーバーにログインします。
  2. SharePoint 2013 管理者シェルを起動します。
  3. 以下のコマンドを実行します。

 

$webapp = get-spwebapplication https://sitecollection/

$webapp.UserDefinedWorkflowMaximumComplexity = 10000

$webapp.Update()

 

補足:

 UserDefinedWorkflowMaximumComplexity プロパティの値はお客様の環境に合わせて適宜変更してください。上記変更例では 10000 に変更しています。

SPWebApplication.UserDefinedWorkflowMaximumComplexity プロパティの詳細については、以下の技術情報を参照してください。

タイトル : SPWebApplication.UserDefinedWorkflowMaximumComplexity property

アドレス : https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spwebapplication.userdefinedworkflowmaximumcomplexity(v=office.15).aspx

 

 

変更方法 2) ASP.NET の最大実行時間の変更

以下の手順にて、特定の Web アプリケーションの ASP.NET の最大実行時間を変更することができます。

executionTimeout 属性の既定値は 110 秒に設定されています。

 

- 手順

1. SharePoint サーバーにアクセスします。

2. Windows エクスプローラーで、以下のフォルダ配下にアクセスし、予め web.config のバックアップを作成しておきます。

 C:\inetpub\wwwroot\wss\VirtualDirectories\<<ワークフローを発行するサイトの Web アプリケーション ポート番号>>

 例) C:\inetpub\wwwroot\wss\VirtualDirectories\80

 

3. フォルダ内にある web.config をテキスト エディタで開きます。

4. 以下の該当箇所を変更します。

 

該当箇所 (既定では 527 行目)

--------

<httpRuntime maxRequestLength="51200" requestValidationMode="2.0"/>

 

変更後

--------

<httpRuntime maxRequestLength="51200" requestValidationMode="2.0" executionTimeout="300"/>

 

変更後の例 (前後の記述を含む)

------

  <system.web>

    <httpHandlers />

    <customErrors mode="On" />

    <httpRuntime maxRequestLength="51200" requestValidationMode="2.0" executionTimeout="300"/>

    <authentication mode="Forms">

      <forms loginUrl="/_login/default.aspx" />

    </authentication>

 

補足:

 executionTimeout プロパティの値はお客様の環境に合わせて適宜変更してください。上記変更例では 300 (秒) に変更しています。

 

5. 変更した web.config を保存します。

 

ExecutionTimeout プロパティの詳細につきましては、以下の技術情報を参照してください。

タイトル : HttpRuntimeSection.ExecutionTimeout プロパティ

アドレス : https://msdn.microsoft.com/ja-jp/library/system.web.configuration.httpruntimesection.executiontimeout(v=vs.100).aspx