using (var httpRequest = new HttpRequestMessage())
{
httpRequest.Method = HttpMethod.Get;
UriBuilder uriBuilder = new UriBuilder(TokenEndPoint);
httpRequest.RequestUri = uriBuilder.Uri;
using (var response = await s_httpClient.SendAsync(httpRequest))
{
var responseString = await response.Content.ReadAsStringAsync();
string token = SafeJsonConvert.DeserializeObject<DirectLineToken>(responseString).Token;
}
}
///<summary>/// class for serialization/deserialization DirectLineToken///</summary>publicclassDirectLineToken
{
publicstring Token { get; set; }
}
C#
// Use the retrieved token to create a DirectLineClient instanceusing (var directLineClient = new DirectLineClient(token))
{
var conversation = await directLineClient.Conversations.StartConversationAsync();
string conversationtId = conversation.ConversationId;
}
若要管理多個工作階段,需要維護外部 Azure Bot Service 通道交談到對應 Copilot Studio 代理程式交談的對應。 Copilot Studio 代理程式交談可以透過兩個屬性來識別和連結:ConversationtId 和 Token。
C#
Dictionary<string, PowerVirtualAgentsConversation> ConversationRouter = new Dictionary<string, PowerVirtualAgentsConversation>();
若要管理交談生命週期,請重新整理 Direct Line 權杖或清除已閒置交談。 如需深入了解權仗重新整理的資訊,請移至重新整理 Direct Line 權杖。 支援重新整理 Direct Line 權杖的 Copilot Studio 代理程式工作階段定義如下:
C#
///<summary>/// Data model class for Copilot Studio agent conversation///</summary>publicclassPowerVirtualAgentsConversation
{
publicstring ConversationtId { get; set; } // The Copilot Studio agent conversation ID retrieved from step 1publicstring Token { get; set; } // The DirectLine token retrieved from step 1publicstring WaterMark { get; set; } // Identify turn in a conversationpublic DateTime LastTokenRefreshTime { get; set; } = DateTime.Now; // Timestamp of last token refreshpublic DateTime LastConversationUpdateTime { get; set; } = DateTime.Now; // Timestamp of last active user message sent to agent
}
開始新的 Copilot Studio 代理程式交談時,請將索引鍵/值組 (external_Azure_Bot_Service_channel_conversationID、PowerVirtualAgentsConversation) 新增至對應資料表。
C#
// After new Copilot Studio agent conversation starts
ConversationRouter[external_Azure_Bot_Service_channel_conversationID] = new PowerVirtualAgentsConversation()
{
Token = token,
ConversationtId = conversationId,
WaterMark = null,
LastConversationUpdateTime = DateTime.Now,
LastTokenRefreshTime = DateTime.Now,
};
若要繼續現有交談,請在收到新的外部 Azure Bot Service 通道訊息後,從對應表中擷取現有交談,將外部交談活動中繼到 Copilot Studio 代理程式,並取得回應。
// Invoked when a message activity is received from the user// Send the user message to Copilot Studio agent and get responseprotectedoverrideasync Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
// Retrieve agent conversation from mapping table// If not exists for the given external conversation ID, start a new Copilot Studio agent conversation
ConversationRouter.TryGetValue(externalCID, out PowerVirtualAgentsConversation currentConversation) ?
currentConversation : /*await StartBotConversationAsync(externalCID)*/;
// Create DirectLine client with the token associated to current conversation
DirectLineClient client = new DirectLineClient(currentConversation.Token);
// Send user message using directlineClientawait client.Conversations.PostActivityAsync(currentConversation.ConversationtId, new DirectLineActivity()
{
Type = DirectLineActivityTypes.Message,
From = new ChannelAccount { Id = turnContext.Activity.From.Id, Name = turnContext.Activity.From.Name },
Text = turnContext.Activity.Text,
TextFormat = turnContext.Activity.TextFormat,
Locale = turnContext.Activity.Locale,
});
// Update LastConversationUpdateTime for session management
currentConversation.LastConversationUpdateTime = DateTime.Now;
}
請參閱 使用 Direct Line 與代理程式通訊,瞭解如何取得 Copilot Studio 代理程式的回應。 收到 Copilot Studio 代理程式的回覆時,請參考從代理程式剖析交談承載,以了解如何將回應剖析為外部 Azure Bot Service 管道回覆。