WF 默認異步執行,ASP.NET 請求同步響應。若直接宿主,工作流啟動後控制權立即返回,ASP.NET 線程結束響應,工作流仍在後台運行——導致客戶端收到未完成的響應。長時間工作流更會佔用昂貴 Web 服務器資源,降低伸縮性。
關鍵點:服務在配置中聲明(非代碼 AddService),因 Runtime 啟動後不可添加服務;HttpModule 負責 Runtime 生命周期與請求綁定。
IGenerateQuote,方法即 WebMethod| 屬性 | 作用 | 必填 |
|---|---|---|
| InterfaceType | 契約接口類型 | 是 |
| MethodName | 暴露為 WebMethod 的方法名 | 是 |
| IsActivating | 是否啟動新工作流實例(首調用 True,後續 False) | 是 |
InputReceived 事件:工作流啟動前初始化上下文(如緩存股票基礎數據)。
InputActivityName:關聯對應的 WebServiceInput(ReturnValue):綁定接口方法返回值Fault 屬性綁定 Exception 對象,自動轉為 SoapException 返回客戶端public interface IGenerateQuote {
decimal GetQuote(string symbol);
}
WebServiceInput:InterfaceType=IGenerateQuote、MethodName=GetQuote、IsActivating=Truesymbol 到工作流屬性 SymbolInputReceived 事件 → CreateStocks:初始化緩存股票字典CodeActivity → UpdateMarketValues:模擬隨機價格波動更新緩存IfElseActivity:條件 TestKnownStock 驗證 Symbol 合法性CodeActivity → RecordStockValue 讀取緩存賦值 StockValue → WebServiceOutput 綁定 (ReturnValue)WebServiceFault 綁定 StockFault = new Exception("Unknown symbol")右鍵工作流項目 →「發布為 Web 服務」→ 重命名 .asmx → 生成網站預編譯。
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);
}
WebServiceOutput/Fault 之前、閒置超時、顯式調用 Persist()IsActivating=False,Runtime 依 SessionId 載入實例繼續執行WF + ASMX 為傳統 .NET 系統提供了低門檻的工作流服務化路徑,核心在於調度器替換、持久化配置與 HttpModule 生命周期管理三板斧。