Как отправить изображения, которые находятся в локальной папке Microsoft Botframework SDK v4 с помощью C # - PullRequest
0 голосов
/ 20 марта 2019

Я создал бота с помощью Microsoft Botframework C # SDK V4, и он работает хорошо. Теперь я хочу добавить несколько изображений для этого бота. Я использую карты, но карты принимают только URL изображения. Я хочу отправить изображения, которые находятся в моей локальной папке. Как я могу заставить это работать ??

Я уже пробовал это с 15.handling вложений github repo (https://github.com/Microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/15.handling-attachments). И хотя я использую точный код при обработке вложений github repo, я получаю приведенную ниже исключительную трассировку стека для встроенных вложений.

Sorry, it looks like something went wrong.’ at Microsoft.Bot.Connector.Conversations.d__10.MoveNext()
— End of stack trace from previous location where exception was thrown —
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Bot.Connector.ConversationsExtensions.d__17.MoveNext()
— End of stack trace from previous location where exception was thrown —
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Bot.Builder.BotFrameworkAdapter.d__15.MoveNext()
— End of stack trace from previous location where exception was thrown —
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Bot.Builder.TurnContext.<>c__DisplayClass22_0. 
<g__SendActivitiesThroughAdapter|1>d.MoveNext()
— End of stack trace from previous location where exception was thrown —
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Bot.Builder.TurnContext.d__21.MoveNext()
— End of stack trace from previous location where exception was thrown —
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.BotBuilderSamples.AttachmentsBot.d__0.MoveNext() in 
C:\botbuilder-samples\samples\csharp_dotnetcore\15.handling-attachments\AttachmentsBot.cs:line 65
— End of stack trace from previous location where exception was thrown —
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Bot.Builder.MiddlewareSet.d__3.MoveNext()
 — End of stack trace from previous location where exception was thrown —
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Bot.Builder.BotAdapter.d__13.MoveNext()’

Как я могу решить эту проблему ??

1 Ответ

1 голос
/ 21 марта 2019

Пример 15.handling-attachments демонстрирует, как прочитать локальный файл и прикрепить его в виде закодированного в base64 изображения:

reply.Attachments = new List<Attachment>() { GetInlineAttachment() };

private static Attachment GetInlineAttachment()
{
    var imagePath = Path.Combine(Environment.CurrentDirectory, @"Resources\architecture-resize.png");
    var imageData = Convert.ToBase64String(File.ReadAllBytes(imagePath));

    return new Attachment
    {
        Name = @"Resources\architecture-resize.png",
        ContentType = "image/png",
        ContentUrl = $"data:image/png;base64,{imageData}",
    };
}

Другой вариант - использовать ConnectorClient для UploadAttachmentAsync api:

private async Task SendFile(ITurnContext turnContext)
{
    var webRoot = _env.ContentRootPath;
    var imagePath = System.IO.Path.Combine(webRoot, "Resources", "BotFrameworkDiagram.png");
    var connector = turnContext.TurnState.GetValueOrDefault("Microsoft.Bot.Connector.IConnectorClient") as ConnectorClient;

    var attachments = new Attachments(connector);
    var response = await attachments.Client.Conversations.UploadAttachmentAsync(
        turnContext.Activity.Conversation.Id,
        new AttachmentData
        {
            Name = "BotFrameworkDiagram.png",
            OriginalBase64 = File.ReadAllBytes(imagePath),
            Type = "image/png"
        });

    var attachmentUri = attachments.GetAttachmentUri(response.Id);

    var attachment = new Attachment
    {
        Name = "BotFrameworkDiagram.png",
        ContentType = "image/png",
        ContentUrl = attachmentUri
    };

    var reply = turnContext.Activity.CreateReply();
    reply.Attachments.Add(attachment);
    await turnContext.SendActivityAsync(reply);   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...