首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IIS池回收后会话引用(并发字典变为空白)

IIS池回收后会话引用(并发字典变为空白)
EN

Stack Overflow用户
提问于 2020-08-05 08:12:45
回答 2查看 497关注 0票数 2

我们有一个bot框架中的Bot设计-4使用.Net c# sdk。此bot托管在IIS上,可在不同的通道上使用,如Directline、MS Teams等。我们希望向MS团队中的所有用户发送主动消息,通知他们,不管他们是否与bot通信。积极的信息将是1:1的信息。

在做了大量的研发工作后,我们发现只有在有会话参考的情况下,我们才能向用户发送积极主动的信息。(如果还有其他方法,请告诉我。)

使用下面的链接和示例向用户发送主动消息:

主动消息示例

提交的文件

我们使用cosmos DB容器和自动保存中间件进行bot会话状态和用户状态管理。

ConfigureServices方法中的Startup.cs文件代码:

代码语言:javascript
运行
复制
var blobDbService = botConfig.Services.FirstOrDefault(s => s.Type == ServiceTypes.BlobStorage) ?? throw new Exception("Please configure your Blob service in your .bot file.");
var BlobDb = blobDbService as BlobStorageService;

var dataStore = new AzureBlobStorage(BlobDb.ConnectionString, BlobDb.Container);
var userState = new UserState(dataStore);
var conversationState = new ConversationState(dataStore);
            
services.AddSingleton(dataStore);
services.AddSingleton(userState);
services.AddSingleton(conversationState);
services.AddSingleton<ConcurrentDictionary<string, ConversationReference>>();
services.AddSingleton(new BotStateSet(userState, conversationState));
services.AddBot<EnterpriseTiBOT>(options =>
{
  // Autosave State Middleware (saves bot state after each turn)
    options.Middleware.Add(new AutoSaveStateMiddleware(userState, conversationState));
}

为每个用户存储会话引用的代码:

代码语言:javascript
运行
复制
private void AddConversationReference(Activity activity)
        {
           
            var conversationReference = activity.GetConversationReference();
            _conversationReferences.AddOrUpdate(conversationReference.User.Id, conversationReference, (key, newValue) => conversationReference);
        }
protected override async Task OnStartAsync(DialogContext dc, CancellationToken cancellationToken = default(CancellationToken))
        {
            AddConversationReference(dc.Context, cancellationToken);
        }

notifyContoller中的代码与GitHub示例中的代码相同。我们面临两个问题:

  1. 当IIS池被回收时,具有会话引用的并发字典变为空白,我们无法向用户发送主动消息,如何将其存储在Blob存储中,并在通知控制器中访问相同的消息?
  2. 我们想要向所有的用户发送积极的信息,无论他们是否已经与bot沟通,有什么办法实现这一点?尝试了文章中的第三种方法。但挑战是,我们无法根据用户ID或用户原则名称向用户发送消息。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-05 13:36:08

  1. 有多种方法来存储会话和用户信息。您应该将这些细节存储在更持久的位置,而不是存储在内存中。这是一个示例应用程序代码,它在安装应用程序时将用户的详细信息和会话Id存储在cosmos DB中。您可以查看实现部分。它可以是任何存储(blob,SQL)。
  2. 为了发送积极的信息,用户必须能够访问您的应用程序。您可以通过团队管理门户为租户中的每个人安装应用程序。下面是一个从管理门户管理应用程序的参考文献

您需要有对话ID (在机器人和用户之间)才能发送积极的信息。并且会话Id是在为用户安装机器人时创建的,或者在用户是用户的团队/组中创建的。

票数 2
EN

Stack Overflow用户

发布于 2021-08-20 09:16:59

我想在答复中补充意见,但我没有足够的声誉这样做。如果您想知道在哪里可以得到和保存会话参考,您可以通过名为: OnConversationUpdateActivityAsync的方法获得它。

我花了一些时间才了解到这一点,所以我认为分享是有用的。您可以从活动中获得很多信息,例如用户ID、通道ID,下面是一些示例代码:

代码语言:javascript
运行
复制
public class ProactiveBot : ActivityHandler
{
...
...

protected override Task OnConversationUpdateActivityAsync(ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
    {
        var conversationReferences = turnContext.Activity.GetConversationReference();
        
        //this is your user's ID
        string userId = conversationReference.User.Id;
        
       //this is the bot's ID and will be the same for all activities under same bot.
        string botId = conversationReference.Bot.Id;
        ...
        ...
        ...
    }
     
} 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63261004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档