Как обслуживать html-файл из другого каталога как ActionResult
У меня есть специализированный случай, когда я хочу подать прямой HTML-файл из действия контроллера.
Я хочу обслуживать его из другой папки, кроме папки Views. Файл находится в
Solution\Html\index.htm
И я хочу обслужить это из стандартного действия контроллера. Могу ли я использовать возвращаемый файл? И как мне это сделать?
5 ответов
Если вы хотите отобразить этот файл index.htm в браузере, вы можете создать действие контроллера следующим образом:
public void GetHtml()
{
var encoding = new System.Text.UTF8Encoding();
var htm = System.IO.File.ReadAllText(Server.MapPath("/Solution/Html/") + "index.htm", encoding);
byte[] data = encoding.GetBytes(htm);
Response.OutputStream.Write(data, 0, data.Length);
Response.OutputStream.Flush();
}
или просто:
public ActionResult GetHtml()
{
return File(Server.MapPath("/Solution/Html/") + "index.htm", "text/html");
}
Допустим, это действие выполняется в контроллере Home, и некоторые пользователи http://yoursite.com/Home/GetHtml, после чего index.htm будет обработан.
РЕДАКТИРОВАТЬ: 2 других метода
Если вы хотите увидеть необработанный HTML- файл index.htm в браузере:
public ActionResult GetHtml()
{
Response.AddHeader("Content-Disposition", new System.Net.Mime.ContentDisposition { Inline = true, FileName = "index.htm"}.ToString());
return File(Server.MapPath("/Solution/Html/") + "index.htm", "text/plain");
}
Если вы просто хотите скачать файл:
public FilePathResult GetHtml()
{
return File(Server.MapPath("/Solution/Html/") + "index.htm", "text/html", "index.htm");
}
Проверь это:
public ActionResult Index()
{
return new FilePathResult("~/Html/index.htm", "text/html");
}
Я расширил ответ wahid для создания HtmlResult
Создать HTML-результат, который расширяет FilePathResult
public class HtmlResult : FilePathResult
{
public HtmlResult(string path)
: base(path, "text/html")
{
}
}
Создан статический метод на контроллере
public static HtmlResult Html(this Controller controller, string path)
{
return new HtmlResult(path);
}
используется как мы возвращаем представление
public HtmlResult Index()
{
return this.Html("~/Index.html");
}
Надеюсь, поможет
Я хочу положить свои два цента. Я нашел это наиболее кратким, и он уже там:
public ActionResult Index()
{
var encoding = new System.Text.UTF8Encoding();
var html = ""; //get it from file, from blob or whatever
return this.Content(html, "text/html; charset=utf-8");
}
Альтернативный подход при использовании ядра.net заключается в использовании FileProvider. Файлы могут быть в папке или встроены во время компиляции.
В этом примере мы будем использовать встроенные файлы.
Добавьте папку в ваш проект, скажем, assets, в ней создайте файл myfile.html, добавьте немного базового html в файл скажем
<html>
<head>
<title>Test</title>
</head>
<body>
Hello World
</body>
</html>
Щелкните правой кнопкой мыши новый файл (при условии, что вы находитесь в Visual Studio), выберите свойства, на экране свойств / действие сборки выберите встроенный ресурс. Это добавит файл в файл csproj.
Щелкните правой кнопкой мыши по вашему проекту, отредактируйте файл csproj. Убедитесь, что ваша группа свойств содержит следующее:
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
Если нет, пожалуйста, добавьте это. Csproj также должен содержать недавно созданный HTML-файл как:
<ItemGroup>
<EmbeddedResource Include="assets\myfile.html" />
</ItemGroup>
Чтобы прочитать файл в вашем контроллере и передать его клиенту, необходим провайдер файлов, который добавляется в файл startup.cs.
Отредактируйте файл startup.cs и убедитесь, что он включает HostingEnvironment:
private readonly IHostingEnvironment HostingEnvironment;
public Startup(IHostingEnvironment hostingEnvironment)
{
HostingEnvironment = hostingEnvironment;
}
Затем создайте файловый провайдер и сделайте его сервисом, который можно внедрить во время выполнения. Создайте его следующим образом:
var physicalProvider = HostingEnvironment.ContentRootFileProvider;
var manifestEmbeddedProvider =
new ManifestEmbeddedFileProvider(Assembly.GetEntryAssembly());
var compositeProvider =
new CompositeFileProvider(physicalProvider, manifestEmbeddedProvider);
services.AddSingleton<IFileProvider>(compositeProvider);
Чтобы обработать файл, перейдите на контроллер, используйте внедрение зависимостей, чтобы получить FileProvider, создать новый сервис и обслуживать файл. Для этого начните с внедрения зависимости, добавив провайдера в ваш конструктор.
IFileProvider _fileProvider;
public MyController(IFileProvider fileProvider)
{
this._fileProvider = fileProvider;
}
Тогда используйте файловый провайдер в вашем сервисе
[HttpGet("/myfile")]
[Produces("text/html")]
public Stream GetMyFile()
{
// Use GetFileInfo to get details on the file passing in the path added to the csproj
// Using the fileInfo returned create a stream and return it.
IFileInfo fileinfo = _fileProvider.GetFileInfo("assets/myfile.html");
return fileinfo.CreateReadStream();
}
Для получения дополнительной информации см. Пример ASP.Net Core поставщика файлов и документацию Microsoft здесь.
Можете ли вы прочитать HTML-файл в строку и вернуть его в действии? Он отображается как HTML-страница, как показано ниже:
public string GetHtmlFile(string file)
{
file = Server.MapPath("~/" + file);
StreamReader streamReader = new StreamReader(file);
string text = streamReader.ReadToEnd();
streamReader.Close();
return text;
}
Главная / GetHtmlFile? Файл = Решение \ Html \ index.htm
Если механизм назначения или хранения HTML-файлов сложен, вы можете использовать виртуальный путь провайдера.