C#:创建单个机器人服务以支持多个机器人应用程序

2023-12-15

该代码位于该网站上https://www.microsoft.com/reallifecode/2017/01/10/creating-a-single-bot-service-to-support-multiple-bot-applications/#comment-148
我是机器人框架的新手,已经用 C# 编写了一个机器人,并且想要为 n 个用户部署相同的机器人,如网页上所示。但给定的代码在Node.js。有没有办法在 C# asp.net 中编写相同的代码

var express = require('express');            
var builder = require('botbuilder');          
var port = process.env.PORT || 3978;         
var app = express();

// a list of client ids, with their corresponding  
// appids and passwords from the bot developer portal.    
// get this from the configuration, a remote API, etc.   
var customersBots = [   
    { cid: 'cid1', appid: '', passwd: '' },  
    { cid: 'cid2', appid: '', passwd: '' },    
    { cid: 'cid3', appid: '', passwd: '' },    
];

// expose a designated Messaging Endpoint for each of the customers 

customersBots.forEach(cust => {

    // create a connector and bot instances for    
    // this customer using its appId and password   
    var connector = new builder.ChatConnector({   
        appId: cust.appid,   
        appPassword: cust.passwd   
     });   
     var bot = new builder.UniversalBot(connector);

     // bing bot dialogs for each customer bot instance   
     bindDialogsToBot(bot, cust.cid);

     // bind connector for each customer on it's dedicated Messaging Endpoint.   
     // bot framework entry should use the customer id as part of the    
     // endpoint url to map to the right bot instance   
     app.post(`/api/${cust.cid}/messages`, connector.listen());     
 });

 // this is where you implement all of your dialogs    
 // and add them on the bot instance   
 function bindDialogsToBot (bot, cid) {    
     bot.dialog('/', [    
         session => {     
           session.send(`Hello... I'm a bot for customer id: '${cid}'`);    
         }    
 ]);    
}    
// start listening for incoming requests    
app.listen(port, () => {    
    console.log(`listening on port ${port}`);    
});    

Resume:

  • 创建一个类并继承ICredentialProvider类。

  • 然后,将您的 Microsoft appId 和密码添加到字典中。

  • 添加您的方法来检查它是否是有效的应用程序;还获得密码 你的申请。

  • 将自定义身份验证添加到您的api/messages控制器。


首先改变你的WebApiConfig :

应该 :

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional }
);

然后,您的自定义身份验证类,从 YourNameSpace 开始:

namespace YourNameSpace {
    public class MultiCredentialProvider : ICredentialProvider
    {
        public Dictionary<string, string> Credentials = new Dictionary<string, string>
        {
            { MicrosoftAppID1, MicrosoftAppPassword1},
            { MicrosoftAppID2, MicrosoftAppPassword2}
        };

        public Task<bool> IsValidAppIdAsync(string appId)
        {
            return Task.FromResult(this.Credentials.ContainsKey(appId));
        }

        public Task<string> GetAppPasswordAsync(string appId)
        {
            return Task.FromResult(this.Credentials.ContainsKey(appId) ? this.Credentials[appId] : null);
        }

        public Task<bool> IsAuthenticationDisabledAsync()
        {
            return Task.FromResult(!this.Credentials.Any());
        }
    }

之后,使用您的自定义添加控制器(api/消息)BotAuthentication,加上你的静态构造函数来更新容器以使用正确的MicorosftAppCredentials基于 BotAuthentication 设置的身份:

[BotAuthentication(CredentialProviderType = typeof(MultiCredentialProvider))]
public class MessagesController : ApiController
{
    static MessagesController()
    {
        var builder = new ContainerBuilder();

        builder.Register(c => ((ClaimsIdentity)HttpContext.Current.User.Identity).GetCredentialsFromClaims())
            .AsSelf()
            .InstancePerLifetimeScope();
        builder.Update(Conversation.Container);
    }

您现在可以通过以下方式处理消息:

[BotAuthentication(CredentialProviderType = typeof(MultiCredentialProvider))]
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
    if (activity.Type == ActivityTypes.Message)
    { 
        ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
        Activity reply = activity.CreateReply("it Works!");                       
        await connector.Conversations.ReplyToActivityAsync(reply);
    }
}

这段代码已经过测试并且适用于我的机器人。
希望能帮助到你 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#:创建单个机器人服务以支持多个机器人应用程序 的相关文章

  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 摆脱node-jsx

    在我的 NodeJS 应用程序的路由器中 我想渲染一个 React 应用程序 由于它没有被浏览器化 并且已反应 因此它返回unexpected token lt 构建时出错 我发现如果我require node jsx install 它不
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData

随机推荐

  • 帮助从 .Net 创建 Zip 文件并从 Java 读取它们

    我正在尝试从 Net 创建一个可以从 Java 代码读取的 Zip 文件 我已经使用 SharpZipLib 创建了 Zip 文件 但如果生成的文件根据 ZipLib 库的 CheckZip 函数有效 并且可以通过 WinZip 或 Win
  • 如何使用字母而不是数字来顺序计数?

    有没有一种简单的方法可以在Python中使用字母进行计数 意思是 A 将用作 1 B 将用作 2 依此类推 Z 之后将是 AA AB 等 所以下面的代码将生成 def get next letter last letter return l
  • Response.Redirect 有时会忽略 URL 编码

    在我当前正在构建的网站中 我们需要大量动态重定向 以维持网站各部分的流量 我目前正在使用response redirect 来实现此目的 重定向URL 是在各种按钮的回发方法后面的代码中动态生成的 这在 95 的情况下都没有问题 但我注意到
  • NSMutableURLRequest 和“请求主体流耗尽”错误

    我对 http PUT 请求和请求正文作为来自文件的流有疑问 无论文件大小有多大 我都会收到错误 NSURLErrorDomain 1021 request body stream exeded 我知道我可以通过实施以下方法来解决这个问题
  • 如何从圆角矩形的顶部中心开始描边

    我想用 SVG 制作一个按钮并复制 YouTube 的自动播放圈 我一直在尝试让笔划在顶部中心开始和结束 但它会在左上角开始最好 因为当我开始更改笔划 dasharry 和笔划 dashoffset 周围的数字时 它开始在开始或结束 我知道
  • ListFragment OnListItemClick 未被调用

    我有一个扩展 ListFragment 的类 它重写了 OnListItemClick 方法 我也在另一个 ListFragment 中以相同的方式执行此操作 并且该方法被调用 我想知道为什么当我单击列表项时该方法没有被调用 这是代码 pa
  • IE 需要 2 个文本框来提交一个按钮?

    我遇到了这个奇怪的问题 我不确定是 ASP NET 还是 IE 7 造成的 这个想法是这样的 当我的表单上只有一个文本框和一个 提交 按钮时 在文本框中按 ENTER 键将仅发布文本框的值 该按钮不会被提交 即使在服务器端也不会触发单击 当
  • Excel VBA 应用程序.OnTime。我认为使用这个……想法是个坏主意?

    我支持的许多用户要求事情自动发生 当然更自动 但这是另一点 一个希望事件每 120 秒发生一次 请参阅我的其他问题 另一个希望在每个工作日下午 5 点发生一件事 这必须在 Excel 工作表上 因此 VBA 作为插件等将是不行的 因为它需要
  • HTML 画布矩形内的阴影效果

    背景 我正在使用浏览器 HTML5 canvas 元素 我有代码 我在网上找到 允许我在画布上绘制一个矩形 Question 我想在鼠标移动事件触发时应用如图所示的 阴影 效果 如何才能实现这一目标 当前方法 我当前的方法是在触发 mous
  • ASP.NET 会话和删除文件夹

    我有一个网络应用程序 管理员可以在其中创建新闻 pdf 文档和他的 cms 面板中的其他内容 问题是 当管理员删除新文件或其他文件时 应用程序会删除与该新文件相关的所有文件 我指的是图像 pdf 和其他文档 主要问题是这些文件存储在 新闻
  • 如何从 JSF 数据表内的 selectOneMenu 获取值?

    我有一个包含一堆行的 JSF 数据表 每行内部都有一个 selectOneMenu 如下所示
  • 跨 PHP、MySQL 等管理日期的最佳方法是什么?

    我的服务器在达拉斯 我在纽约市 PHP 和 MySQL 都有用于设置时区的配置变量 我如何让他们一起工作 我应该在 MySQL 中存储哪些日期 如何让 PHP 根据用户的偏好来处理日期更改 请记住 我认为我从未让 PHP 显式设置过日期 它
  • 从 ASMX Web 服务返回 JSON,无需 XML 包装器?

    我需要从 C Web 服务获取 Json 数据 我知道有几个基于此的问题 相信我 我已经阅读了很多 但只是让我更加困惑 这就是我所做的 在我的网络服务中 我包括 System Web Script Services ScriptServic
  • 是否可以为内嵌文本创建框阴影效果?

    我想创建这样的效果 有没有办法通过 CSS JS 来做到这一点 非常感谢 我是网页设计的新手 在过去的几个小时里我一直在努力解决这个问题 下面是一种仅使用 CSS 即可实现文本多行 填充 突出显示行为的方法 这是基于其他地方找到的 box
  • python 线程 - 迭代 n 个任务时始终有 x 个活动线程

    我基本上想做的是 import threading import Queue def test thread elem q q put elem 2 a 1 2 3 4 5 6 7 8 q Queue Queue results for x
  • 我可以在 __new__ 或 __init__ 期间创建类属性吗?

    我想做这样的事情 但到目前为止我还没有取得多大成功 我想让每个 attr 成为一个仅在访问时计算 lazy eval 的属性 class Base object def init self for attr in self myattrs
  • 删除Python字典中的重复值

    我在 Stack Overflow 上发现了这个问题从字典中删除重复项另一个问题中的人也有我同样的问题 我尝试了他们给他的解决方案 但没有一个有效 你能帮助我吗 这是我的清单 然后这是我的代码 def printed filename da
  • 获取 WordPress 中激活插件的列表并从管理菜单中删除插件链接

    是否可以在 WordPress 中获取激活插件列表并将其从管理菜单栏中删除 我想从管理栏中删除所有激活插件链接 找出页面并替换your plugin page 这将列出所有激活的插件 apl get option active plugin
  • 更改子图上的刻度数

    如果我有一个子图 如何更改其刻度数 我不知道数据的最大值和最小值 我的代码是 azal rif add subplot 111 azal plot eels 10 9 averspe label data azal plot eels 10
  • C#:创建单个机器人服务以支持多个机器人应用程序

    该代码位于该网站上https www microsoft com reallifecode 2017 01 10 creating a single bot service to support multiple bot applicati