首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WF 工作流發布為 Web 服務完整實戰:從架構設計到部署驗證的端到端指南

     編輯:關於.NET

核心挑戰:異步工作流與同步 Web 服務的阻抗失配

WF 默認異步執行,ASP.NET 請求同步響應。若直接宿主,工作流啟動後控制權立即返回,ASP.NET 線程結束響應,工作流仍在後台運行——導致客戶端收到未完成的響應。長時間工作流更會佔用昂貴 Web 服務器資源,降低伸縮性。

解決方案三支柱

  1. 手動線程調度服務:替換默認調度器,強制工作流在 ASP.NET 線程同步執行
  2. 持久化服務:長流程保存狀態至 DB,跨請求恢復執行
  3. WorkflowWebHostingModule (HttpModule):管理容器級 WorkflowRuntime 單例、請求上下文綁定、Session 狀態維護

Web.config 完整配置範本

```xml
```

關鍵點:服務在配置中聲明(非代碼 AddService),因 Runtime 啟動後不可添加服務;HttpModule 負責 Runtime 生命周期與請求綁定。

工作流服務契約設計

  1. 定義接口 IGenerateQuote,方法即 WebMethod
  2. 接口與工作流置於獨立程序集,ASP.NET 項目引用
  3. .asmx 文件由 VS「發布為 Web 服務」自動生成,無需手寫

三大核心活動深度解析

WebServiceInput——服務入口

屬性作用必填
InterfaceType契約接口類型是
MethodName暴露為 WebMethod 的方法名是
IsActivating是否啟動新工作流實例(首調用 True,後續 False)是

InputReceived 事件:工作流啟動前初始化上下文(如緩存股票基礎數據)。

WebServiceOutput——正常返回

  • InputActivityName:關聯對應的 WebServiceInput
  • (ReturnValue):綁定接口方法返回值
  • 同一執行路徑僅允許一個 Output/Fault

WebServiceFault——異常返回

  • 同樣關聯 InputActivity
  • Fault 屬性綁定 Exception 對象,自動轉為 SoapException 返回客戶端
  • 支持任意異常類型,ASP.NET 自動轉換

端到端實戰:股票報價服務

步驟 1:創建順序工作流庫 + 接口

public interface IGenerateQuote {
    decimal GetQuote(string symbol);
}

步驟 2:設計工作流(VS 設計器)

  1. 拖入 WebServiceInput:InterfaceType=IGenerateQuote、MethodName=GetQuote、IsActivating=True
  2. 綁定參數 symbol 到工作流屬性 Symbol
  3. InputReceived 事件 → CreateStocks:初始化緩存股票字典
  4. CodeActivity → UpdateMarketValues:模擬隨機價格波動更新緩存
  5. IfElseActivity:條件 TestKnownStock 驗證 Symbol 合法性
  6. True 分支:CodeActivity → RecordStockValue 讀取緩存賦值 StockValue → WebServiceOutput 綁定 (ReturnValue)
  7. False 分支:WebServiceFault 綁定 StockFault = new Exception("Unknown symbol")

步驟 3:發布為 Web 服務

右鍵工作流項目 →「發布為 Web 服務」→ 重命名 .asmx → 生成網站預編譯。

步驟 4:控制台客戶端驗證

var ws = new Workflow1_WebService();
try {
    Console.WriteLine("CONT: {0:C}", ws.GetQuote("CONT"));
    Console.WriteLine("LITW: {0:C}", ws.GetQuote("LITW"));
    Console.WriteLine("TSPT: {0:C}", ws.GetQuote("TSPT"));
    ws.GetQuote("ABC"); // 觸發 Fault
} catch (Exception ex) {
    Console.WriteLine("Error: " + ex.Message);
}
客戶端輸出
圖 1:客戶端調用輸出,正常報價與異常捕獲

長時間工作流的狀態管理

  • 持久化點:WebServiceOutput/Fault 之前、閒置超時、顯式調用 Persist()
  • 客戶端需維護 Session Cookie(ASMX 自動支持)跨請求關聯實例
  • 再調用時 IsActivating=False,Runtime 依 SessionId 載入實例繼續執行

安全與生產就緒清單

  • [ ] ASP.NET/Web Service 安全最佳實踐(認證、授權、傳輸加密、輸入驗證)
  • [ ] SQL 持久化庫備份/高可用
  • [ ] 工作流版本管理:副本號、動態更新、側邊版本
  • [ ] 監控:Runtime 事件、持久化延遲、異常率、併發數
  • [ ] 負載測試:手動調度器同步執行對線程池壓力評估

WF + ASMX 為傳統 .NET 系統提供了低門檻的工作流服務化路徑,核心在於調度器替換、持久化配置與 HttpModule 生命周期管理三板斧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved