Blog de Hinault Romaric (.NET Core, ASP.NET Core, Azure, DevOps)
par , 14/01/2018 à 15h16 (3872 Affichages)
Ces dernières années, l’intelligence artificielle et l’apprentissage automatique figurent parmi les plus grosses tendances de l’IT. Ils ouvrent la voie à de nouvelles plateformes qui sont de plus en plus populaires, dont le bot Framework de Microsoft.
Le bot Framework est un ensemble d’outils supportés par Microsoft, permettant de développer avec souplesse et simplicité des bots. Il s’agit des agents conversationnels qui seront en mesure d’échanger avec une entité tierce. Un bot sera par exemple en mesure de guider un humain pour effectuer la commande d’un repas, acheter un article, etc. Les implémentations possibles sont assez nombreuses et il y a actuellement un engouement pour de telles technologies.
Le Bot Framework offre des outils pour développer, connecter, tester, déployer et gérer des bots. Le kit de développement est disponible à la fois pour Node.js et le Framework .NET.
Pour les développeurs .NET, Microsoft offre des modèles de projets pour démarrer rapidement avec la création d’une application Bot, sans avoir besoin de démarrer à partir de zéro. Ce template contient notamment les packages bot Framework nécessaires au fonctionnement d’un bot basique et le code permettant au bot de répliquer à une conversation.
Cependant, ce template est disponible pour ASP.NET MVC 5. Dans ce billet, je vais vous montrer comment créer une bot application qui repose sur ASP.NET Core et .NET Core 2.0. Vous aurez besoin d’un poste sur lequel sont installés :
- Visual Studio 2017 ;
- .NET Core 2.0 ;
- Le bot emulator pour les tests.
Création de la Web API de démarrage
Pour commencer, vous allez démarrer Visual Studio 2017 et créer une Web API qui repose sur ASP.NET Core 2.0 et .NET Core :
Ajout des packages du Bot Framework
Nous aurons besoin d’installer deux packages. Ces packages vont nous permettre de créer une connexion avec le Bot Framework. Il s’agit entre autres du :
- Package Microsoft.Bot.Connector, qui offre une API REST de connexion au Bot Framework ;
- Package Microsoft.Bot.Connector.AspNetCore qui est une librairie ASP.NET Core pour le connecteur Bot Framework.
Pour installer ces packages, vous allez utiliser le gestionnaire de packages NuGet :
Définir les paramètres de configuration pour enregistrer votre bot
Pour être en mesure d’utiliser votre Bot avec le Bot Service ou le tester avec l’émulateur, vous devez enregistrer au préalable votre bot et renseigner les informations d’enregistrement dans votre application. Il s’agit entre autres :
- de l'ID de l’application, qui aura pour nom de paramètre MicrosoftAppId ;
- et le mot de passe de l’application qui aura pour nom de paramètre MicrosoftAppPassword.
Vous devez donc éditer le fichier appconfig.json pour ajouter ces paramètres :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| {
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
}
}
},
"MicrosoftAppId": "",
"MicrosoftAppPassword": ""
} |
Pour l’instant, nous n’allons mettre aucune valeur. Lorsque vous allez enregistrer votre bot sur https://dev.botframework.com, vous devez modifier le fichier de configuration pour renseigner ces valeurs.
Modifier le fichier Startup.
Nous allons modifier le fichier Startup.cs pour ajouter les services nécessaires au fonctionnement du bot dans le conteneur d’injection de dépendances.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Bot.Connector;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace BotApplication
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(Configuration);
var credentialProvider = new StaticCredentialProvider(Configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppIdKey)?.Value,
Configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppPasswordKey)?.Value);
services.AddAuthentication(
options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}
)
.AddBotAuthentication(credentialProvider);
services.AddSingleton(typeof(ICredentialProvider), credentialProvider);
services.AddMvc(options =>
{
options.Filters.Add(typeof(TrustServiceUrlAttribute));
});
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseAuthentication();
app.UseMvc();
}
}
} |
Ajouter la classe MessagesController
Vous allez commencer par supprimer le fichier ValuesController. Ensuite, vous devez ajouter dans ce dossier le fichier MessagesController.cs. La classe MessagesController va permettre d’écrire le code pour assurer une interaction avec le bot. Son contenu est le suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Bot.Connector;
using Microsoft.Extensions.Configuration;
namespace BotApplication.Controllers
{
[Route("api/[controller]")]
public class MessagesController : Controller
{
private readonly IConfiguration configuration;
public MessagesController(IConfiguration configuration)
{
this.configuration = configuration;
}
[Authorize(Roles = "Bot")]
[HttpPost]
public async Task<OkResult> Post([FromBody] Activity activity)
{
var appCredentials = new MicrosoftAppCredentials(this.configuration);
var client = new ConnectorClient(new Uri(activity.ServiceUrl), appCredentials);
var reply = activity.CreateReply();
if (activity.Type == ActivityTypes.Message)
{
reply.Text = $"You sent {activity.Text} which was {activity.Text.Length} characters";
await client.Conversations.ReplyToActivityAsync(reply);
}
return Ok();
}
}
} |
Ceci fait, vous pouvez tester votre application avec le bot Framework Emulator. Pour cela, vous devez lancer l’émulateur, ensuite exécuter votre application.
Une fois l’application en cours d’exécution, vous devez saisir l’URL permettant de faire un appel sur MessagesController (http://localhost:port/api/messages), l’ID ainsi que le mot de passe de l’application. Vu que nous n’avons rien renseigné pour ces paramètres dans notre fichier de configuration, vous allez laisser ces champs vides :
Une fois tous les champs renseignés, cliquez sur Connect et vous pouvez commencer à utiliser votre Bot :
Il faut noter toutefois que la prise en charge de « Dialogs » n’est malheureusement pas offerte sur ASP.NET Core. Ceci à cause de l’absence d’un package officiel pour Microsoft.Bot.Builder supportant .NET Core 2.0. Ce qui réduit énormément ce qui est possible de faire avec le Bot Framework, ASP.NET Core et .NET Core 2.0.
En fouillant un peu sur le GitHub du projet, la principale cause serait l’absence de BinaryFormatter dans .NET Core 2.0. Il n’y a plus donc de sérialisation pour les types System.RuntimeType et System.RuntimeMethod qui sont cependant très utilisés dans le package Microsoft.Bot.Builder.
Le projet complet est disponible sur mon GitHub.