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

C# : Creating a Single Bot Service to Support Multiple Bot Applications

此代码在此网站上 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}`);    
});    

简历:

  • 创建一个class并继承自ICredentialProvider class。

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

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

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


首先改变你的WebApiConfig

应该是:

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

然后,您的自定义身份验证 class,从 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/messages) 添加到您的自定义 BotAuthentication,加上您的静态构造函数以根据 BotAuthentication 设置的身份更新容器以使用正确的 MicorosftAppCredentials :

[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);
    }
}

此代码已经过测试,适用于我的机器人。
希望对您有所帮助:)