前言
我們使用 offline_dl 來達到使用 botframework 開發全地端的 Chatbot (使用 Microsoft Bot Framework 地端的 WebChat 機器人(企業內)).
我們想要在 offline_dl 中去驗證由 Bot 送過來的訊息是否可靠,所以想在 Bot 發送訊息時 (Conversations.ReplyToActivityAsync or DialogContext.PostAsync),多加入一個 Header 的資料,來讓 offline_dl 中可以去驗證。
實作
一開始有看到 Conversations 有一個 ReplyToActivityWithHttpMessagesAsync Method ,可以讓我們放要額外加的 Header ,但那就要從 ReplyToActivityAsync 改成 ReplyToActivityWithHttpMessagesAsync. 那用 DialogContext.PostAsync Method 要怎麼辦呢?
參考 github 上的一些討論後發現,其實可以透過抽換 ConnectorClient 來達到我們的需求。從 Bot Call Connector 是透過 ConnectorClient 的 HttpClient 來處理的。所以只要 2 步驟就可以了哦!
1.繼承自 ConnectorClient ,然後在建構子中,將我們想要加的 Header 加到 HttpClient.DefaultRequestHeaders 之中,如下。
1 | public class MyConnectorClient : ConnectorClient |
2.透過 Autofac 將原本的 ConnectorClient 置換成 MyConnectorClient ,如下,
1 | Conversation.UpdateContainer(builder => |
所以在 Dialog 中使用 await context.PostAsync 就會直接用到我們的 MyConnectorClient. 而如果在 Controller 中使用的話,就要將原本是 new ConnectorClient 改成 MyConnectorClient. 不然就要透過 Autofac 來建立它,如下,
1 | using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message)) |
從 offline_dl 的 v3/conversations/:conversationId/activities/:activityId log Request 的 Headers ,可以發現,它已經包含了我們新增的 Header (x-rm)了哦! 如下,
參考資料
[Question] How can I override Autofac configuration to provide my own custom ConnectorClient?
Intercepting every message between bot and user
使用 Microsoft Bot Framework 地端的 WebChat 機器人(企業內)
Add custom header when call Conversations.ReplyToActivityAsync and DialogContext.PostAsync
offline_dl
Conversation.SendAsync Authentication using custom multi-tenant authentication (Bot Builder 3.5.2)