Stworzyłem projekt strony internetowej asp.net core 1.0 z wieloma obszarami.
W HomeController w obszarze aplikacji mam następującą akcję:
public IActionResult Index()
{
string content = System.IO.File.ReadAllText("./Areas/Application/App/Index.html");
return base.Content(content, new MediaTypeHeaderValue("text/html"));
}
Gdy plik html jest zwracany, w mojej przeglądarce pojawia się wiele błędów 404 z nie odnalezionych plików biblioteki javascript.
Indeks.html ze wszystkimi plikami .js jest SPA w obszarze strony głównej asp.net.
To SPA jest wbudowane + wdrożone w folderze projektu / obszarów / aplikacji / aplikacji.
Kiedy buduję + wdrażam SPA do wwwroot folder, a następnie wszystkie pliki statyczne są znalezione.
Myślę, że to oznacza, że statyczna ścieżka do pliku jest zawsze względna do wwwroot, aby SPA działało.
Pytanie 1: Czy istnieje jakiś sposób skonfigurowania folderu wwwroot jako ścieżki wwwroot / app z klasą WebHostBuilder poprzez:
.UseWebRoot("./wwwroot/app")
właśnie i wyraźnie dla obszar zastosowań?
Czy to oznacza, że wwwroot strony powinien nadal działać?
Najlepszą rzeczą, jaką mogłem osiągnąć, jest folder wwwroot z 2 podfolderami:
- stronie internetowej
- aplikacja
i chciałbym skonfigurować stronę internetową i aplikację dla 2 ścieżek wwwroot dla domyślnego „obszaru” i jawnego obszaru aplikacji.
Pytanie 2: Jak mogę to zrobić?
AKTUALIZACJA 1
Zgodnie z komentarzem Pawła zmieniłem:
app.UseStaticFiles();
do:
app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "Areas","Application", "App")),
RequestPath = new PathString("/Application")
});
Ale nadal otrzymuję te same błędy 404 dla pliku .js, jakby nie były dostępne w katalogu wwwroot ???
404 W narzędziach konsoli programisty żądanych przez aplikację jednostronicową:
http://localhost:52159/vendor/reflect-metadata/Reflect.js (404)
200 Wprowadzane ręcznie w pasku adresu przeglądarki:
http://localhost:52159/Application/vendor/reflect-metadata/Reflect.js
Czy to oznacza, że statyczny plik obsługujący rdzeń asp.net działa, ale jest coś jeszcze, co nie działa jakoś? Chyba nie powinienem zmieniać w SPA czegoś, co byłoby głupie ...
Dodałem zrzut ekranu mojej struktury pliku, abyście lepiej zrozumieli mój problem, a może znaleźli mój błąd użytkownika ...:
Odpowiedzi:
0 dla odpowiedzi № 1Teraz znalazłem rozwiązanie, w którym trzeba zastosować zmiany.
system.config.ts
System.config({
map: {
"@angular": "Application/vendor/@angular",
"rxjs": "Application/vendor/rxjs",
"main": "Application/main.js",
"app": "Application/app",
},
packages: cliSystemConfigPackages
});
W ten sposób wszystkie pliki kątowe 2 / rxjs są obsługiwane ze ścieżki katalogu:
„Obszar / Aplikacja / Aplikacja” po wprowadzeniu adresu URL „/ Aplikacja”.
Musiałem też dodać „Aplikację” do „aplikacji” głównej i głównej beczki.
index.html
<body>
<app-root>Loading...</app-root>
{{#each scripts.polyfills}}
<script src="Application/{{.}}"></script>
{{/each}}
<script>
System.import("Application/system-config.js").then(function () {
System.import("Application/main.js");
}).catch(console.error.bind(console));
</script>
</body>
</html>
Są to zmiany w pliku index.html.
Teraz moja podstawowa aplikacja Asp.net „Application” ma własny „wwwroot” oddzielony od wwwroot strony publicznej.