Как вернуть встроенный статический HTML-файл из основного контроллера Asp.Net? - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть следующая конфигурация:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseDefaultFiles();

        app.UseFileServer(new FileServerOptions
        {
            FileProvider = new EmbeddedFileProvider(typeof(Startup).Assembly, typeof(Startup).Namespace + ".WebApp"),
            RequestPath = string.Empty
        });

        app.UseCors("CorsPolicy");

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "angular",
                defaults: new {controller = "Angular", action = "Index"},
                template: "{*url}");
        });
    }

Мои файлы проекта Angular находятся в пространстве имен MyNamespace.WebApp.

Мои AngularController и Startup классы находятся в пространстве имен MyNamespace

Когда я не использую MVC и не получаю доступ к http://localhost:8000, он загружает файл index.html в папку WebApp.Теперь для всех других запросов (например, /action) я сопоставил его с AngularController, который выглядит следующим образом:

public class AngularController : Controller
{
    public IActionResult Index() {
        return View("/index.html");
    }
}

Я отладил и подтвердил, что запрос приходит к AngularController.Index()и возвращает View("/index.html").Но после этого я получаю 500 Ошибка.Я предполагаю, потому что он не может найти файл представления.

Как мне сообщить MVC, чтобы извлечь файл index.html из встроенных файлов?

Я пробовал следующее:

return View("~/index.html");
return View("index.html");
return View("~/../index.html");
return View("../index.html");
return View("~/WebApp/index.html");
return View("WebApp/index.html");

Ничего из этого не работает.Возможно, я пропустил шаг?

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Мое решение состояло в том, чтобы настроить контроллер, который будет использовать EmbeddedFileProvider и извлекать содержимое встроенного файла следующим образом:

public AngularController: Controller
{
    private IAppSettings appSettings;

    public AngularController(IAppSettings appSettings)
    {
        this.appSettings = appSettings;
    }

    public IActionResult Index()
    {
        var fileProvider = new EmbeddedFileProvider(this.appSettings.WebAssembly, this.appSettings.WebNamespace);
        var contents = this.fileProvider.GetDirectoryContents(string.Empty);

        IFileInfo index = null;
        foreach (var file in contents)
        {
            if (file.Name.Equals("index.html"))
            {
                index = file;
                break;
            }
        }

        if (index == null)
        {
            throw new Exception("'index.html' not found");
        }

        var reader = new StreamReader(index.CreateReadStream());
        var text = reader.ReadToEnd();
        return this.Content(text, "text/html");
    }
}

Assembly и Namespace встроенных файлов предоставляются с помощью внедрения зависимостей, чтобы сделать его более универсальным. Вы также можете жестко закодировать его в контроллер.

0 голосов
/ 17 ноября 2018

В этом примере я попытался создать файл HTML с именем htmlpage.html в пути Views/Home/htmlpage.html.

В файле Index.cshtml (путь: Views/Home/Index.cshtml):

@using Microsoft.AspNetCore.Hosting
@using System.IO
@inject IHostingEnvironment environment
@{ 
    string htmlPath = "Views/Home/htmlpage.html";
}

@Html.Raw(File.ReadAllText(System.IO.Path.Combine(environment.ContentRootPath, htmlPath)))

В файле htmlpage.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>bar</title>
</head>
<body>
    <h3>foo</h3>
</body>
</html>

Тест:

1


Этот способ не требует: app.UseDefaultFiles(); и app.UseFileServer(...);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...