1. 程式人生 > >WF工作流技術內幕 —— 通過Web服務呼叫Workflow工作流(基礎例項)

WF工作流技術內幕 —— 通過Web服務呼叫Workflow工作流(基礎例項)

在開發一個企業ERP系統時,其業務流程是開發的關鍵,系統往往會將開發好的業務方案發布為Web服務以供外界呼叫。客戶可以通過伺服器,網際網路等等方式 去呼叫服務,而解決業務上需要及資訊的交換問題。有見及此,微軟在.NET 3.0基礎上釋出了WF,WCF,以及WCS,WPF(為開發表現層而設)。WF,WCF正是解決企業核心問題的關鍵,通過WF可以輕鬆地輕鬆地按照業務 邏輯去實現開發,然後憑藉WCF的強大功能把同一服務繫結多個不同的EndPoint,這樣客戶端與服務與伺服器端通訊就不會再受開發語言的影響。

在這章裡面只是為你講述如何將WF與Web Service結合使用,而關於WF的開發的詳細介紹請參考(

WF技術內幕 )。WF與Web Service相互呼叫分為兩情況:

  1. 當客戶只希望傳入一些基礎資料,而直接獲取計算結果時,我們可以將WF釋出為一個Web Service,這樣就可以將WF實現的功能公開到網際網路上,通過Web服務可以解決伺服器與客戶端之間開發語言的束縛。
  2. 當工作流的每個操作步驟都需要呼叫Web服務來獲取結果時,我們則可以使用InvokeWebServiceWorkflow在工作流中呼叫Web Service來實現(具體操作可參考通過InvokeWebServiceActivity在Workflow工作流中呼叫Web服務 ) 。

在開發中小型ERP開發初期,往往都會把重點放在業務流程上,只要深入瞭解企業的業務流程後,將DAL實現為最基礎的單表操作,然後就可以輕鬆地以 WF實現業務層的開發,最後就可以把WF作為服務公佈在網際網路上(當然在構建中大型系統時,會實現多層開發模式,使用工作流直接去實現業務邏輯,最後以 Web Service方式公開服務)。
而在這裡,重點不是介紹ERP的開發,而只是想介紹一下如何將WF公開為Web服務,下面我們還是以“Hello World”為例子。
首先開發一個介面

        namespace Microsoft.IService
       {
            public interface IService_T1
            {
                   string DoWork();
             }

       }       

然後新建一個順序工作流,分別插入WebServiceInputActivity和WebServiceOutputActivity作為啟動,結束 項。WebServiceInputActivity是服務的啟動標記,而WebServiceOutputActivity是服務的結束標記。

       注意,把webServiceInputActivity1的InActivating設定為True,這是證明webServiceInputActivity1為此工作流的啟動項的標誌。 然後InterfaceType設定為對應介面Microsoft.IService.IService_T1,將MethodName方法名設定為DoWork

在工作流的方法中設定codeActivity的執行方法裡面設定方法內容

namespace Microsoft.Workflows

{

      public sealed partial class Workflow4 : SequentialWorkflowActivity
     {
        public string Data ;

        public Workflow4()
        {
            InitializeComponent();
        }

        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
            Data = "Hello World";
        }
     }

}

最後,在webServiceOuputActivity的InputActivityName設定為webServiceInputActivity1,表示通過webServiceOutputActivity1來結束webServiceInputActivity1,然後把ReturnValue屬性設定為Data

這時候,基礎的設定已經完成,現在在專案屬性上選擇“作為Web服務釋出”。

此時,系統會自動把Workflow釋出為*.asmx,生成的.asmx檔案如下:

<%@ WebService Class="Microsoft.Workflows.Workflow4_WebService " %>

//此處Class名稱與Workflow的空間名和類名相對應

再為服務新增必要的配置檔案:

<?xml version="1.0"?>
<configuration>
    <configSections>
        <section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    </configSections>
    <WorkflowRuntime Name="WorkflowServiceContainer">
        <Services>
            <add type="System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
            <add type="System.Workflow.Runtime.Hosting.DefaultWorkflowCommitWorkBatchService, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" UnloadOnIdle="true" LoadIntervalSeconds="5" ConnectionString="Data Source=LESLIE-PC;Initial Catalog=WorkflowPersistence;Integrated Security=True"/>

       //這裡是為Workflow新增SQL資料庫持久化服務,這是可選設定。
        </Services>
    </WorkflowRuntime>
    <appSettings/>
    <connectionStrings/>
    <system.web>    
        <compilation debug="true"/> 
        <authentication mode="Windows"/>      
        <httpModules>
            <add type="System.Workflow.Runtime.Hosting.WorkflowWebHostingModule, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="WorkflowHost"/>
        </httpModules>
    </system.web>
</configuration>

這時候在網路上第一次呼叫服務時,系統會正常操作。

<? xml version="1.0" encoding="utf-8" ?> <string xmlns="http://tempuri.org/">Hello World</string> 但第二次呼叫。系統將提示提示一個錯誤,這是因為WorkflowWebHostingModle HTTP模組是使用Cookies來儲存工作流的GUID的,當工作流在伺服器返回時,SQL持久化資料器裡將不再儲存這個GUID。這時候需要關閉瀏覽器,重新啟動才能正常執行。 System.InvalidOperationException: 在狀態永續性儲存中找不到 ID 為“3a8b9688-fb3f-4a10-bb84-6bf99c30119a”的工作流。 總結,通過WF可以輕鬆企業的業務邏輯,再結合Web Service在網際網路上釋出,就可以供給不同客戶端使用,從而擺脫開發語言的困擾。以上的例子只是將WF釋出為Web服務的最基礎用法,因為 Workflow物件只會暫時存在,當服務結束時,Workflow物件就會被清理。但是很多時候系統可能要求能維持狀態並支援多個Web Service呼叫的工作流,下一章將為你詳細介紹有關內容。

對NET系統開發有興趣的朋友,請加入QQ群:NET技術開發聯盟   59557329 一起討論  點選這裡加入此群