Angularjs — не удалось загрузить шаблон — URL близок, но отсутствует имя виртуального каталога

#angularjs #templates

#angularjs #шаблоны

Вопрос:

Я развернул свое приложение angular на 2 веб-серверах с балансировкой нагрузки. Иногда шаблоны загружаются, в других случаях этого не происходит, так как URL неверен — имя виртуального каталога отсутствует.

Просматривая заголовки запроса шаблона, я вижу, что реферер

http://mysite/folderInIIS/VirtualDirectoryName

при поиске шаблонов используется URL-адрес запроса

http://mysite/folderInIIS/Templates/myTemplate.html

что не удается

Если я отредактирую это на:

http://mysite/folderInIIS/VirtualDirectoryName/Templates/myTemplate.html

Я нахожу свой шаблон.

Итак, поскольку это периодически происходит, я думаю, что один из веб-серверов настроен неправильно, и балансировщик нагрузки определит, на какой из них вы перейдете, и увидите ли вы ошибку или нет.

Но что может привести к созданию URL-адреса шаблона без имени виртуального каталога в пути?

Вырезка из моей директивы, показывающая templateUrl:

 return {
        restrict: 'E',
        scope: {split : 'amp;', collapseUp: 'amp;', collapseDown: 'amp;'},        
        replace: true,
        transclude: true,
        templateUrl: 'Templates/collapseTemplate.html',
        controller: ['$scope', '$rootScope', '$timeout', function ($scope, $rootScope, $timeout) {
            var panes = $scope.panes = [];
            var splitterControl;
  

Ответ №1:

Вам нужно определить <base href="..." /> in the раздел страницы, например:

 <base href="http://mysite/folderInIIS/VirtualDirectoryName" />
  

Конечно, если вы хотите, чтобы он работал как в локальной среде тестирования (без виртуального каталога), так и на сервере (в виртуальном каталоге), вам необходимо динамически вычислять базовый href.

Например, в .NET MVC вы можете использовать:

 <base href="@Url.Content("~")" />
  

Надеюсь, это поможет.