Как я могу прикрепить файл к сообщению с помощью Microsoft Bot Framework?

У меня есть служба веб-API:

[ActionName("download")]
[HttpGet]
public HttpResponseMessage Download()
{
    var stream = new FileStream(HostingEnvironment.MapPath("~/tmp/") + "doc.pdf", FileMode.Open);
    var result = new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new StreamContent(stream)
    };
    result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
    {
        FileName = document.Name + "." + document.AssociatedApplication.Extension
    };

    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    return result;
}

Код бота:

if (message.Text.StartsWith("/d"))
{
    var contentType = "application/pdf";
    var attachment = new Attachment(contentType, "https://localhost/api/documents.download");
    var response = await client.GetAsync("https://localhost/api/documents.download");

    var data = await response.Content.ReadAsByteArrayAsync();
    System.IO.File.WriteAllBytes(HostingEnvironment.MapPath("~/tmp/") + document.Name + "." + document.Extension, data);

    var stream = System.IO.File.ReadAllBytes(HostingEnvironment.MapPath("~/tmp/") + document.Name + "." + document.Extension);
    attachment.Content = stream;

    var msg = message.CreateReplyMessage("This is your document: ");
    msg.Attachments = new[] { attachment };

    await context.PostAsync(msg);
}

Если я изменю тип содержимого на сервере и клиенте на «image/png» и отправлю изображение PNG с сервера клиенту, то этот образец будет работать идеально — в эмуляторе Bot Framework я получил текст «Это ваш документ:» и получил изображение.

Но если я попытаюсь отправить PDF-документ с типом содержимого «application/pdf» или «application/octet-stream» и получить его на клиенте с типом содержимого «application/pdf», то в эмуляторе Bot Framework я получу такое сообщение:

Это ваш документ: (https://localhost/api/documents.download)

Можно ли получить в разговоре "настоящий" документ вместо ссылки для скачивания (как это работает с изображениями)?

PS: Этот вопрос работает только для "image/png" или подобных типов содержимого.


person feeeper    schedule 08.04.2016    source источник


Ответы (1)


2 вещи: 1. не похоже, что вы устанавливаете тип содержимого для вложения (в приведенном выше коде используется "") 2. Содержимое не предназначено для отправки медиафайлов. Наши сообщения ограничены 256 КБ сериализованных json. Если вы хотите отправить документ или изображение, вы отправляете вложение с URL-адресом, указывающим на файл, и типом контента для файла 3. Не все каналы имеют семантику для файлов, отличных от изображений, и они представляют их как ссылки. Мы используем тип контента, чтобы определить, можем ли мы сделать что-то конкретное для канала для данного вложения.

person T Laird-McConnell    schedule 13.04.2016