#.net-core #botframework #bots #azure-language-understanding #azure-bot-service
#.net-core #botframework #боты #azure-понимание языка #azure-бот-сервис
Вопрос:
Проблема заключается в создании приложения-бота через Bot Framework с использованием .Net Core. В .Net Framework я использовал API для создания приложения-бота. В начальном методе я передаю строковый параметр и получаю это значение из URL-адреса IFrame, но в .Net Core я использую метод OnTurnAsync и не могу переопределить этот метод для передачи строкового параметра как «userName». Я делюсь между .Net core и .Ниже приведены начальные методы Net framework.
Я вызываю приложение бота через IFrame, например; https://webchat.botframework.com/…amp;userName=test ‘ style=»ширина: 600 пикселей; высота: 600 пикселей;»>
Итак, как я могу передать параметр методу OnTurnAsync?
.Net Framework
public async Task<HttpResponseMessage> Post([FromBody]Activity activity, string userName)
{
if (activity.Type == ActivityTypes.Message)
{
var keyword = activity.Text.ToLower().ToEnglish();
var responseAttachment = KeywordHelper.GetAttachmentResult(keyword);
if (responseAttachment != null)
{
var answer = ((HeroCard)responseAttachment.Content).Title.ToString();
conversation.Response = answer;
this.conversationService.InsertToConversation(conversation);
var connector = new ConnectorClient(new Uri(activity.ServiceUrl));
var reply = activity.CreateReply();
reply.Attachments.Add(responseAttachment);
await connector.Conversations.ReplyToActivityAsync(reply);
activity.Type = ActivityTypes.Message;
}
}
}
.Net Core
public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
if (turnContext.Activity.Type == ActivityTypes.Message)
{
var userName = "userName";
var keyword = turnContext.Activity.Text.ToLower().ToEnglish();
var responseAttachment = KeywordHelper.GetAttachmentResult(keyword);
if (responseAttachment != null)
{
var answer = ((HeroCard)responseAttachment.Content).Title.ToString();
conversation.Response = answer;
this.conversationService.InsertToConversation(conversation);
var connector = new ConnectorClient(new Uri(turnContext.Activity.ServiceUrl));
var reply = turnContext.Activity.CreateReply();
}
}
}
Комментарии:
1. Вы все еще можете использовать контроллер с версией 4, как показано в этом примере mvc: github.com/Microsoft/BotBuilder-Samples/tree/master/samples /…
2. Итак, я думаю, что следует переопределить метод OnTurnAsync, чтобы получить параметр userName из Iframe, но я не смог. Как я могу получить параметр userName при начальном методе?
3. Если вам нужно только имя пользователя, его можно получить из activity.From.Name (идентификатор пользователя и имя пользователя — это два параметра, которые webchat передаст из строки URL в действие).
Ответ №1:
Вы все еще можете использовать контроллер веб-Api с BotBuilder V4, как показано в этом примере: https://github.com/Microsoft/BotBuilder-Samples/blob/samples-work-in-progress/samples/csharp_dotnetcore/13.core-bot/Controllers/BotController.cs
[Route("api/messages")]
[ApiController]
public class BotController : ControllerBase
{
private readonly IBotFrameworkHttpAdapter Adapter;
private readonly IBot Bot;
public BotController(IBotFrameworkHttpAdapter adapter, IBot bot)
{
Adapter = adapter;
Bot = bot;
}
[HttpPost]
public async Task PostAsync()
{
// Delegate the processing of the HTTP POST to the adapter.
// The adapter will invoke the bot.
await Adapter.ProcessAsync(Request, Response, Bot);
}
}
Однако, если вы передаете идентификатор пользователя и имя пользователя в качестве параметров строки запроса в WebChat iframe, вы можете получить имя пользователя из activity.From.Name