Asp net core вернуть html файл
FileResult is an abstract base class for all file rendering action result, user can render file in the browser or download the required file using these built-in action results. By following this blog you will create a small application to understand FileResults by using all these FileResults.
Add a download area to your application by right click Areas -> Add -> Area -> MVC Area -> give name as download. This creates a folder with name download and subfolders for controllers, views, models. The Area is created to logically group download related functionality of the application.
In this step, you will add EmployeeReports controller in download area. Right click on Areas -> Download -> Controllers folder and select Add -> Controllers -> MVC Controller Empty -> name it as EmployeeReportsController and click Ok.
Create a folder under wwwroot folder with name download to keep downloadable files. Add a sample file to this folder. Your file structure should be like this.
PhysicalFileResult
Sometimes you need to return the file from a physical location, not from relative to wwwroot folder. You will have to _hostingEnvironment.ContentRootPath to access the physical path.
Inject Dependency of IWebHostEnvironment through the constructor.
The following code returns a pdf file from the physical location.
FileStreamResult
The FileStreamResult sends binary content to the response by using a stream instance when we want to return the file as a FileStream. The contents are streamed while returning to the client. The streamed response appears on the browser as a downloaded file.
FileStreamResult is very useful for playing video or dynamically create a zip file and download it.
Отправка html-кода
Я следовал инструкциям, но в браузере получаю ошибку 406. Мой код:
Когда я удаляю Produces строку, я получаю обычный текст
Welcome в браузере (без ошибок).Что мне не хватает? Спасибо.
Starting with AspNetCore 2.0, it's recommended to use ContentResult instead of the Produce attribute
Менять не надо (и атрибута AddMvc нет , конечно). Produce
Я надеюсь, что это помогает кому-то.
Кстати, если вам нужно передать дополнительную кодировку, как я, вы можете использовать BaseController.Content() в третьей перегрузке.
Вам нужно добавить Content-Type заголовок text/html в запрос, который вы отправляете при использовании Produces атрибута.
Если вы отправляете через браузер, это будет работать хорошо, потому что браузер по умолчанию отправляет Content-type заголовок как text/html
Не уверен, что понимаю, что вы имеете в виду: сначала браузер отправляет запрос, поэтому я не могу это контролировать; во- вторых, в соответствии с этим docs.microsoft.com/en-us/aspnet/core/mvc/models/formatting «веб-браузеры, как правило, предоставляют заголовки Accept, которые включают широкий спектр форматов, включая подстановочные знаки. По умолчанию, когда платформа обнаруживает, что запрос поступает из браузера, он игнорирует заголовок Accept и вместо этого возвращает содержимое в настроенном для приложения формате (JSON, если не настроено иное)".
Спасибо - я видел вашу правку. Однако это именно мой вопрос: он должен работать, но не работает для меня. Почему ? Хотя мой вопрос был ясен, поскольку я указал браузер: «. следовал инструкциям, но я получаю ошибку 406 в файле browser «.
Можете ли вы проверить с помощью инструментов разработчика браузера, что тип контента, отправляемый браузером для запроса, является text/html
Хорошая идея. Я пробовал 4 браузера и Postman, но специально не проверял заголовок Content-Type запроса. Я скоро вернусь сюда.
Установка кодов статуса
Для установки статусных кодов применяется свойство StatusCode , которому передается числовой код статуса:
В данном случае устанавливается код 404, который указывает, что ресурс не найден.
FileContentResult
The FileContentResult inherits from FileResult. That converts file content to byte array and returns it as a file to the browser, it does not send the file directly to the browser.
To convert file content to byte array you can use the ReadAllBytes function of the System.IO.File object. Following code converts pdf content to byte array and returns a file.
FileContentResult is mostly used when your file contents are stored in the database with byte array / varbinary datatype column.
You can also use ReadAllBytesAsync to convert file content to a byte array and generate the file asynchronously. Here action method returns Task
Установка заголовков
Для установки заголовков применяется свойство Headers , которое представляет тип IHeaderDictionary . Для большинства стандартных заголовков HTTP в этом интерфейсе определены одноименные свойства, например, для заголовка "content-type" определено свойство ContentType . Другие, в том числе свои кастомные заголовки можно добавить через метод Append() . Например:
Стоит отметить, что для вывода кириллицы желательно устанавливать заголовок ContentType, в том числе кодировку, которая применяется в отправляемом содержимом (в примере выше это "text/plain; charset=utf-8" ).
Также стоит отметить, что вместо
можно было бы написать
FileResult
The action result that returns FileResults writes files as a response. The File method takes two parameters first is the path of the file and the second is the MIME type.
The following code renders a pdf file to the browser. The File method uses the file path and the MIME type that is application/pdf. Add this code to the EmployeeReportsController file.
MIME type from Filename Extension
If the MIME type is not known at design time as multiple types of files will be returned by action method then you can use FileExtensionContentTypeProvider from Microsoft.AspNetCore.StaticFiles namespace.
VirtualFileResult
Return files from database
You might have stored your files in the database in varbinary datatype columns instead of saving them on physical disks. You can use FileContentResult to return files by converting database stored bytearray to FileContent.
Все ранее рассмотренные методы OnGet и OnPost, предназначенные для обработки GET и POST-запросов, ничего не возвращали, то есть имели в качестве возвращаемого типа тип void и просто выполняли некоторое действие:
В реальности данные методы по умолчанию возвращали связанную с классом страницу Razor. Однако иногда возникает необходимость возвратить некоторый результат, например, статусный код ошибки или сделать редирект. И подобные методы, как и методы контроллеров, также могут возвращать объекты IActionResult. Для этого в классе PageModel определено ряд методов:
Content() возвращает объект ContentResult, то есть фактически некоторое текстовое содержимое
File() возвращает с помощью различных перегруженных версий объекты FileContentResult/FileStreamResult/VirtualFileResult, то есть отправляет клиенту файл
Forbid() возвращает статусный код 403
LocalRedirect()/LocalRedirectPermanent() выполняет переадресацию по определенному локальному адресу
NotFound() возвращает статусный код 404
PhysicalFile() возвращает файл по физическому пути
Page() возвращает объект PageResult или фактически текущую страницу Razor
Redirect()/RedirectPermanent() выполняет переадресацию по определенному адресу
RedirectToAction()/RedirectToActionPermanent() выполняет переадресацию на определенное действие контроллера
RedirectToPage()/RedirectToPagePermanent() выполняет переадресацию на определенную страницу Razor
RedirectToRoute()/RedirectToRoutePermanent() выполняет переадресацию по определенному маршруту
StatusCode() возвращает объект StatusCodeResult, то есть посылает статусный код
Unauthorized() возвращает объект UnauthorizedResult, то есть статусный код ошибки 401
Большинство этих методов и возвращаемых ими результатов было рассмотрено ранее в теме Результаты действий контроллеров и ряде последующих статей. В данном случае рассмотрим некоторые моменты, которые могут вызвать трудности. Например, в зависимости от результата надо возвратить либо статусный код ошибки, либо страницу Razor.
Например, пусть у нас есть класс Person, который представляет данные:
Допустим, мы хотим в PageModel получить из списка по имени нужный объект Person:
Метод OnGet возвращает IActionResult. В зависимости от того, найден ли пользователь, этот IActionResult будет представлять либо NotFoundResult, либо PageResult. Причем метод Page() возвращает текущую страницу, как если бы у нас был бы просто определен метод OnGet с типом void:
При обращении к веб-приложению, как правило, пользователь ожидает получить некоторый ответ, например, в виде веб-страницы, которая наполнена данными. На стороне сервера метод контроллера, получая параметры и данные запроса, обрабатывает их и формирует ответ в виде результата действия. Результат действия - это тот объект, который возвращается методом после обработки запроса.
Результатом действия может быть практически что угодно. Например, в прошлых темах использовался объект string, например:
Пользователь передает методу некоторые значения и ответ на запрос видит в своем браузере строку ответа.
Результатом действия может быть какой-нибудь сложный объект:
В данном случае использовался класс Geometry из прошлой темы.
Результатом может быть даже void , то есть по сути ничего:
В данном случае метод GetVoid представляет вполне реальное действие контроллера, к которому можно обращаться из адресной строки браузера, передавать параметры, и который может содержать сложную логику обработки запроса. Только после обращения к этому методу пользователь увидит в своем веб-браузере одну пустоту, так как метод ничего не возвращает.
Но в большинстве случаев мы будем иметь дело не с void и даже не с типом string, а с объектами типа IActionResult , которые непосредственно предназначены для генерации результата действия. Интерфейс IActionResult находится в пространстве имен Microsoft.AspNetCore.Mvc и определяет один метод:
Метод ExecuteResultAsync() принимает контекст действия и выполняет генерацию результата.
Этот интерфейс затем реализуется абстрактным базовым классом ActionResult :
ActionResult добавляет синхронный метод, который выполняется в асинхронном. И если мы вдруг захотим создать свой класс результата действий, то как раз можем либо унаследовать его от ActionResult, либо реализовать интерфейс IActionResult.
Итак, создадим свой класс результата действий. Для этого вначале добавим в проект папку Util , в которой будет храниться классы результатов. Затем в эту папку добавим новый класс, который назовем HtmlResult :
Теперь используем этот класс в контроллере:
ContentResult : пишет указанный контент напрямую в ответ в виде строки
EmptyResult : отправляет пустой ответ в виде статусного кода 200
Аналогичен следующему методу:
NoContentResult : во многом похож на EmptyResult, также отправляет пустой ответ, только в виде статусного кода 204
FileResult : является базовым классом для всех объектов, которые пишут набор байтов в выходной поток. Предназначен для отправки файлов
FileContentResult : класс, производный от FileResult , пишет в ответ массив байтов
VirtualFileResult : также производный от FileResult класс, пишет в ответ файл, находящийся по заданному пути
PhysicalFileResult : также производный от FileResult класс, пишет в ответ файл, находящийся по заданному пути. Только в отличие от предыдущего класса использует физический путь, а не виртуальный.
FileStreamResult : класс, производный от FileResult , пишет бинарный поток в выходной ответ
ObjectResult : возвращает произвольный объект, как правило, применяется в качестве базового класса для других классов результатов. Но можно применять и самостоятельно:
BadRequestResult : производный от StatusCodeResult . Возвращает статусный код 400, тем самым указывая, что запрос некорректен
BadRequestObjectResult : производный от ObjectResult . Возвращает статусный код 400 с некоторой дополнительной информацией
OkResult : производный от StatusCodeResult . Возвращает статусный код 200, который уведомляет об успешном выполнении запроса
OkObjectResult : производный от ObjectResult . Возвращает статусный код 200 с некоторой дополнительной информацией
CreatedResult : возвращает статусный код 201, который уведомляет о создании нового ресурса. В качестве параметра принимает адрес нового ресурса
CreatedAtActionResult : возвращает статусный код 201, который уведомляет о создании нового ресурса. В качестве параметра принимает название метода и контроллера, а также параметров запроса, которые вместе создают адрес нового ресурса
CreatedAtRouteResult : возвращает статусный код 201, который уведомляет о создании нового ресурса. В качестве параметра принимает название маршрута, который используется для создания адреса нового ресурса
AcceptedResult : возвращает статусный код 202
AcceptedAtActionResult : возвращает статусный код 202. В качестве параметра принимает название метода и контроллера, а также параметров запроса
AcceptedAtRouteResult : возвращает статусный код 202. В качестве параметра принимает название и параметры маршрута
ChallengeResult : используется для проверки аутентификации пользователя
JsonResult : возвращает в качестве ответа объект или набор объектов в формате JSON
PartialViewResult : производит рендеринг частичного представления в выходной поток
RedirectResult : перенаправляет пользователя по другому адресу URL, возвращая статусный код 302 для временной переадресации или код 301 для постоянной переадресации зависимости от того, установлен ли флаг Permanent .
RedirectToRouteResult : класс работает подобно RedirectResult , но перенаправляет пользователя по определенному адресу URL, указанному через параметры маршрута
RedirectToActionResult : выполняет переадресацию на определенный метод контроллера
RedirectToPageResult : выполняет переадресацию на определенную странцу Razor (относится к подсистеме RazorPages)
LocalRedirectResult : перенаправляет пользователя по определенному адресу URL в рамках веб-приложения
ViewComponentResult : возвращает в ответ сущность ViewComponent
ViewResult : производит рендеринг представления и отправляет результаты рендеринга в виде html-страницы клиенту
Body : получает или устанавливает тело ответа в виде объекта Stream
BodyWriter : возвращает объект типа PipeWriter для записи ответа
ContentLength : получает или устанавливает заголовок Content-Length
ContentType : получает или устанавливает заголовок Content-Type
Cookies : возвращает куки, отправляемые в ответе
HasStarted : возвращает true , если отправка ответа уже началась
Headers : возвращает заголовки ответа
Host : получает или устанавливает заголовок Host
StatusCode : возвращает или устанавливает статусный код ответа
Redirect() : выполняет переадресацию (временную или постоянную) на другой ресурс
WriteAsJson()/WriteAsJsonAsync() : отправляет ответ в виде объектов в формате JSON
WriteAsync() : отправляет некоторое содержимое. Одна из версий метода позволяет указать кодировку. Если кодировка не указана, то по умолчанию применяется кодировка UTF-8
SendFileAsync() : отправляет файл
Самый простой способ отправки ответа представляет метод WriteAsync() , в который передается отправляемые данные. В качестве дополнительного параметра мы можем указать кодировку:
Читайте также: