JS 404 шаблон .NET Core React Redux проблема при развертывании - PullRequest
0 голосов
/ 23 мая 2018

Впервые в .Net Core и начали новый проект, построенный на основе шаблона .NET Core React Redux.Приложение работает нормально через VS2017.
Я создал папку публикации (отладочная конфигурация) через VS2017.Публикация, кажется, идет гладко.При попадании на опубликованный сайт я получаю 404s для моих файлов js и css.

Chrome Dev Tools

Index.html выглядит так:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
        <meta name="theme-color" content="#000000"><base href="/"/
        ><link rel="manifest" href="/manifest.json">
        <link rel="shortcut icon" href="/favicon.ico">
        <title>nSITE Explorer</title>
        <link href="/static/css/main.872a5e7a.css" rel="stylesheet">
        <link href="/static/css/main-cssmodules.7f40876c.css" rel="stylesheet">
    </head>
    <body>
        Test
        <noscript>You need to enable JavaScript to run this app.</noscript>
        <div id="root"></div>
        <script type="text/javascript" src="/static/js/main.735c95d1.js"></script>
    </body>
</html>

Я вижу слово «Тест», которое было брошено в HTML.

Вот часть структуры файла на сервере: Структура файла

Если яизмените атрибут src в html следующим образом:

<body>
    Test
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
    <script type="text/javascript" src="explorer2/ClientApp/build/static/js/main.735c95d1.js"></script>
</body>

И обновите сайт, я получу 200. Результат с измененным index.html

Но ответ отчто 200 это ... HTML? ответ от 200

В случае, если это поможет, вот мои Startup.cs.

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.SpaServices.ReactDevelopmentServer;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
using Windsor.Site.Code;
using System.Net;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Http;
using Swashbuckle.AspNetCore.Swagger;
using System.Reflection;
using Windsor.Site.Controllers;
using System.IO;

namespace Windsor.Site
{
    public class Startup
    {
        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Startup));
        public IConfiguration Configuration { get; }

        public Startup(IHostingEnvironment env)
        {
            var configurationBuilder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();

            Configuration = configurationBuilder.Build();
            // If we want to pull these from the db we can so an ado call right here
        }


        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<IAppSettingsRepository, AppSettingsRepository>();
            services.AddScoped<ILayerRepository, LayerRepository>();
            services.AddScoped<IProfileRepository, ProfileRepository>();
            services.AddScoped<ISiteRepository, SiteRepository>();
            services.AddSingleton<IConfiguration>(Configuration);

            services.AddMvc();

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new Info
                {
                    Version = "v1",
                    Title = "nSite Explorer API",
                    Description = "List of API for nSite Explorer"
                });
                c.IncludeXmlComments(GetXmlCommentsPath());
                c.DescribeAllEnumsAsStrings();
            });

            // In production, the React files will be served from this directory
            services.AddSpaStaticFiles(configuration =>
            {
                configuration.RootPath = "ClientApp/build";
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            // Should be the first item in Configure so we can catch exceptions from the other items
            app.UseExceptionHandler(
                 options =>
                 {
                     options.Run(
                         async context =>
                                {
                                    var ex = context.Features.Get<IExceptionHandlerFeature>();
                                    // Log the error
                                    log.Error("An unhandled exception occurred.");
                                    log.Error("Request Path : " + context.Request.Path);
                                    log.Error("Exception Message : " + ex.Error.Message);
                                    if (ex.Error.InnerException != null)
                                    {
                                        log.Error("Inner Exception : " + ex.Error.InnerException.Message);
                                    }
                                    log.Error("Exception Stack Trace : " + ex.Error.StackTrace);

                                    // Return the error to the client
                                    context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                                    context.Response.ContentType = "text/html";

                                    if (ex != null)
                                    {
                                        var err = $"<h1>Error: {ex.Error.Message}</h1>";
                                        await context.Response.WriteAsync(err).ConfigureAwait(false);
                                    }
                                }
                    );
                 });

            // Enable middleware to serve generated Swagger as a JSON endpoint.
            app.UseSwagger();
            // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), 
            // specifying the Swagger JSON endpoint.
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "nSite Explorer API V1");
            });

            app.UseStaticFiles();
            app.UseSpaStaticFiles();

            //app.UseIdentity();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller}/{action=Index}/{id?}");
            });

            app.UseSpa(spa =>
            {
                spa.Options.SourcePath = "ClientApp";

                if (env.IsDevelopment())
                {
                    spa.UseReactDevelopmentServer(npmScript: "start");
                }
            });
        }
        private string GetXmlCommentsPath()
        {
            var commentsFileName = Assembly.GetExecutingAssembly().GetName().Name + ".xml";
            return System.IO.Path.Combine(AppContext.BaseDirectory, commentsFileName);
        }
    }
}

У кого-нибудь есть мысли по поводу того, почему это происходит?Заранее спасибо.

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