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

最佳答案

恢复:

  • 创建一个类并继承自 ICredentialProvider 类。
  • 然后,将您的 Microsoft appId 和密码添加到字典中。
  • 添加你的方法来检查它是否是一个有效的应用程序;也得到密码
    你的申请。
  • 向您的 api/messages Controller 添加自定义身份验证。


  • 首先更改您的 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());
            }
        }
    

    之后,添加带有自定义 BotAuthentication 的 Controller (api/messages),以及静态构造函数以更新容器以根据 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);
        }
    }
    

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

    关于C# : Creating a Single Bot Service to Support Multiple Bot Applications,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44559700/

    10-11 16:57