Nano Hash - криптовалюты, майнинг, программирование

Web Api возвращает мусор для текстовых файлов, если они не запускаются из панели браузера.

Я пишу файловую службу, используя веб-API Asp.Net. Служба извлекает файлы (Css, Excel, Csv и т. д.) с SQL Server и предоставляет их в ответ на запросы Get.

Мой первый тестовый пример для файлов Css. Проблема в том, что, хотя я вижу правильные данные на стороне сервера, когда браузер извлекает/декодирует их, результаты искажаются. Проблема, похоже, связана с кодировками.

Вот заголовки запроса/ответа в FireFox:

введите здесь описание изображения

Когда я нажимаю на вкладку ответа в FireBug, вот как это выглядит:

введите здесь описание изображения

Результаты выглядят так, как будто ascii отображается как utf8. Это HTML-представление в FireBug:

введите здесь описание изображения

Вышеприведенный пример — это iFrame внутри приложения Facebook, в котором работает ssl.

Если я возьму URL-адрес и открою его прямо в браузере, он работает и правильно отображает мой Css:

введите здесь описание изображения

Таким образом, когда я извлекаю свой файл Css из тега в своем приложении Facebook, я получаю мусор (проблема с кодировкой?). Если я получаю его прямо из браузера, он работает.

Мой код CssFormatter MediaTypeFormatter:

    public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
    {

        var taskSource = new TaskCompletionSource<object>(); 
        try
        {
            var incomingFile = value as FileRestService.Entity.IFile;

            var ms = new MemoryStream(incomingFile.DataBuffer);

            ms.CopyTo(writeStream);
            ms.Flush();

            taskSource.SetResult(writeStream);

        }
        catch (Exception e) 
        { 
            taskSource.SetException(e); 
        } 
        return taskSource.Task; 

    }

Я неправильно создаю поток ответов? Я заметил, что в заголовках ответов не указана кодировка. Это проблема?


Ответы:


1

Я считаю, что самый простой способ справиться с этим - написать что-то вроде (вот важные детали):

public class Formatter : MediaTypeFormatter {
    // TODO override the constructor to add some mappings or some other way for this formatter to be picked up

    // TODO override CanReadType and CanWriteType according to your rules

    public override void SetDefaultContentHeaders(Type t, HttpContentHeaders headers, string mediaType) {
        base.SetDefaultContentHeaders(t, headers, mediaType);
        headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") {
            FileName = "SomeName.ext"
        };
    }

    public override Task WriteToStreamAsync(Type t, object value, Stream s, HttpContentHeaders headers, TransportContext context) {
        return Task.Factory.StartNew(() => {
            // TODO code to write to the output stream, flush it but don't explicitly close it
        });
    }
}
29.08.2012
  • Нужно ли устанавливать ContentDisposition, если возвращаемый файл не является вложением? Файлы обычно имеют формат Css и извлекаются браузером при отображении страницы. 30.08.2012
  • Вероятно, вам не нужно явно задавать заголовок диспозиции, но вы можете убедиться, что заголовок содержимого установлен правильно. 31.08.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..