C#:创build一个单一的机器人服务来支持多个机器人应用程序

此代码在此网站上https://www.microsoft.com/reallifecode/2017/01/10/creating-a-single-bot-service-to-support-multiple-bot-applications/#comment-148
我是bot框架的新手,已经在C#中编写了一个bot,想要为网页上显示的n个用户部署相同的bot。 但是给定的代码在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}`); }); 

恢复:

  • 创build一个类并从ICredentialProvider类inheritance。

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

  • 添加你的方法来检查它是否是一个有效的应用程序; 也为您的应用程序获取密码。

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


首先改变你的WebApiConfig

应该 :

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

然后,你的自定义authentication类,从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); } } 

此代码已经过testing,适用于我的机器人。
希望能帮助到你 :)