2017-02-25 33 views
2

我的目標是在我的自定義functoids中發生錯誤後,影響在掛起的實例窗口的「錯誤信息」選項卡中出現在BizTalk管理控制檯中的錯誤說明。如果可能,我還希望ErrorReport.Description提升的屬性在失敗的消息上顯示此錯誤描述。如何顯示BizTalk管理控制檯中自定義functoid錯誤的異常消息?

我已經閱讀了關於自定義functoid開發的所有內容,但是我無法找到關於它們內部錯誤處理的很多內容。特別是,無論何時我的functoids引發異常,我都會看到樣板「異常已被引發到調用的目標」消息,每當異常通過反射發生時發生,而不是異常本身的消息。

我曾希望能在BaseFunctoid類框架中找到一些東西,它允許我提交一個錯誤字符串,以便遍歷反射邊界。有沒有辦法從自定義的functoid中傳遞錯誤信息,以便BizTalk管理控制檯將顯示它?

如果我模擬DatabaseLookupFunctoid和DatabaseErrorExtractFunctoid採用的方法,是否有某種方法可以使提取的錯誤失敗,而不是將其映射到目標模式中的字段,如其示例中所示?

回答

0

最簡單的答案是,你只是這樣做。

請記住,沒有什麼特別的,在所有關於在BizTalk應用程序處理錯誤,它只是定期老式.NET錯誤處理

所以,你要做的就是捕獲你的代碼中的錯誤,將細節寫入Windows事件日誌(一定要創建一個自定義的事件源)和......就是這樣。這就是我所做的一切。我不擔心BT Admin中出現的具體內容。 強大的文本

1

做,這是使用自定義的C#,寫在你的代碼是這樣的最簡單的方法:

System.Diagnostics.EventLog.WriteEntry("EVENT_LOG_SOURCE", "Error message...", System.Diagnostics.EventLogEntryType.Error); 

正如約翰-305中提到,你需要確保你的事件源註冊(例如System.Diagnostics.EventLog.CreateEventSource("EVENT_LOG_SOURCE", "Application") - 但這應該作爲安裝步驟的一部分,使用EventLogInstaller或某種腳本來設置環境)。確實,BizTalk中的錯誤處理只是.NET錯誤處理,但有一點需要記住的是,映射實際上是作爲XSLT執行的,而執行它們的上下文會對異常和錯誤的處理方式產生重大影響處理,特別是未處理的例外。

業務流程

如果你正在執行中有異常處理在其業務流程的變換,拋出將被處理和異常甚至可能落入你的業務流程有額外的日誌 - 換句話說,從C#functiod執行throw將按照您認爲它可以在C#中的其他地方工作的方式工作。但是,我儘量避免這種情況,因爲您不知道映射是否會在某處使用,並且因爲XSLT中的異常處理並不總是按照您的想法進行工作(請參見下文)。

發送/接收端口

不幸的是,如果你在執行上發個圖或在其接收端口和throw異常,你將幾乎可以肯定在事件日誌中得到非常無益的錯誤信息,並集線器中的暫停實例。沒有簡單,直接的方法來簡單地「取消」一個轉換 - XSLT 1.0沒有任何指定的方法(例如參見Throwing an exception from XSLT)。這會讓您輸出一個錯誤字符串到輸出中的特定節點(和/或輸出到EventLog),或者編寫大量完全自定義的XSLT來嘗試驗證輸入,或正確設計您的模式並在必要時使用驗證組件。例如,如果您有一個節點必須匹配某個特定的正則表達式,或者永遠不應該爲空,或者永遠不應該重複X次以上,請確保您在模式上設置了這些限制,然後確保您通過了XmlValidator或在嘗試映射之前類似。

+0

我已經有EventLog的東西進入外部程序集函數與腳本functoids調用;但是,我希望通過在掛起的實例本身上獲取錯誤消息來簡化管理。相反,我們必須用時間戳來進行眼球相關來找出哪個錯誤與哪個實例相關,這是一種痛苦。我也嘗試了錯誤字符串輸出節點方法,但是這也需要將整個源文檔映射到目標,以便在檢測到錯誤時可用於更多處理,這對於我們的模式來說似乎不好。 – bwerks

+0

如果您需要爲路由或消息關聯執行此操作,您可以隨時檢查您的值並將其輸出到提升的屬性,然後根據該值進行路由......但我認爲驗證效果仍然會更好 –

相關問題