Проблема развертывания на рабочем сервере, связанная с файлом .cs и RequireJS - PullRequest
0 голосов
/ 20 июня 2019

У меня есть проект в разработке с использованием ASP.Net. И иметь рабочий сервер на AWS, используя Elastic Beanstalk. Проблема в том, что файлы JS после того, как requireJS не загрузится с помощью созданного мной помощника. Но на моем локальном ПК, когда я отлаживаю, он отлично работает!

Я добавил requireJS, настроил его и добавил помощника для поиска и использования определенного JS-файла в соответствии с отображаемым представлением. После публикации проекта с использованием пакета веб-развертывания я загружаю и развертываю с использованием Elastic Beanstalk в соответствующем приложении. Все идет хорошо, но когда я посещаю производственную площадку, JS не работает. Помощник не загружает файл JS, но на моем локальном ПК отлаживается.

Это нижний колонтитул, где я вызываю метод в помощнике:

@using ypf.Helper

<footer>
...
</footer>

<script src="~/Scripts/dist/require.js"></script>
<script>
    @Html.ViewSpecificRequireJS()
</script>

</body>
</html>

Это помощник: RequireJSHelper.cs

using System;
using System.Configuration;
using System.IO;
using System.Text;
using System.Web;
using System.Web.Mvc;

namespace ypf.Helper
{
    public static class RequireJsHelpers
    {
        public static MvcHtmlString RequireJs(this HtmlHelper helper, string config, string module)
        {
            var require = new StringBuilder();

            string jsLocation = "/Scripts/";


            if (File.Exists(helper.ViewContext.HttpContext.Server.MapPath(Path.Combine(jsLocation, module + ".js"))))
            {
                require.AppendLine("require( [ \"" + jsLocation + config + "\" ], function() {");
                require.AppendLine("    require( [ \"" + module + "\"] );");
                require.AppendLine("});");
            }

            return new MvcHtmlString(require.ToString());
        }

        public static MvcHtmlString ViewSpecificRequireJS(this HtmlHelper helper)
        {
            var action = helper.ViewContext.RouteData.Values["action"];
            var controller = helper.ViewContext.RouteData.Values["controller"];
            var namespaces = helper.ViewContext.RouteData.DataTokens["namespaces"];

            if (namespaces != null)
            {
                string namespacesToString = ((string[])namespaces)[0].Replace(".", " ");
                string[] namespacesWordList = namespacesToString.Split(' ');
                string namespacesWord1 = ((string[])namespacesWordList)[2];
                string namespacesWord2 = ((string[])namespacesWordList)[3];
                return helper.RequireJs("config.js", string.Format("views/{0}/{1}/{2}/{3}", namespacesWord1, namespacesWord2, controller, action));
            } else
            {
                return helper.RequireJs("config.js", string.Format("views/{0}/{1}", controller, action));
            }
        }
    }

}

Итак, я хочу, чтобы этот вывод на производство после визуализации:


</footer>

<script src="/Scripts/dist/require.js"></script>
<script>
    require( [ "/Scripts/config.js" ], function() {
    require( [ "views/Home/Index"] );
});

</script>

Вместо этого я получаю это:

</footer>

<script src="/Scripts/dist/require.js"></script>
<script>

</script>

Опять же, он дает ожидаемый результат при локальной отладке, но не на рабочем сервере, когда я загружаю и развертываю .zip, используя Elastic Beanstalk

Решение:

Позвольте пояснить тем, кто читает это, что эта проблема не была вызвана AWS Beanstalk. Это может произойти в любом облачном сервисе, так как проблема была в файле, который я создал.

Благодаря ответу @ BowB и @ Abdul . Это утверждение вернуло false, потому что переменная jsLocation = "/Scripts/" не имела ~, и при рендеринге в работе ей требовался символ ~, чтобы сервер мог понять, где найти папку Scripts.

Итак, моей первой попыткой было добавление ~ к значению jsLocation, например jsLocation = "~/Scripts/", а затем загрузка и развертывание снова, это работало как чудо, но потом, когда я отлаживал локально, это не понять, где найти папку Scripts в объявлении RequireJS require: require(["~/Scripts/config.js"])

Кажется, что при сборке пакета развертывания C # compile и RequireJS понимают символ ~ по-разному. Если в файле C # обнаружен символ ~, он понимает, является ли он корневым каталогом, в котором находится папка Scripts, но в RequireJS он понимает другое место или не допустит ~.

Итак, окончательное решение я конкатенировал "~" перед переменной jsLocation в операторе IF: if (File.Exists(helper.ViewContext.HttpContext.Server.MapPath(Path.Combine("~" + jsLocation, module + ".js"))))

Вместо добавления к значению jsLocation

Теперь он находит папку Scripts в Debug и в Production. Для тех, кто пытается использовать requireJS в .Net проекте, которому может понадобиться это решение.

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Да, похоже, файл не существует. Проверьте, существует ли файл в месте, указанном в приведенном ниже коде.

if (File.Exists(helper.ViewContext.HttpContext.Server.MapPath(Path.Combine(jsLocation, module + ".js"))))
0 голосов
/ 20 июня 2019

Это если оператор возвращает false в вашем развертывании:

if (File.Exists(helper.ViewContext.HttpContext.Server.MapPath(Path.Combine(jsLocation, module + ".js"))))

Убедитесь, что файл /Scripts/views/Home/Index.js копируется в правильное место в конфигурации рабочего развертывания. Вероятно, это зависит от используемого вами идеала.

...