2015-07-17 2 views
1

Я разработчик веб-приложений с ASP.NET MVC 5 в server-side и AngularJS на стороне клиента. Навигацию на стороне клиента управляют с помощью модуля UI-Router. На стороне сервера я настроил собственную аутентификацию и авторизацию. Когда я excecute приложение может видеть панель навигации со многими ссылками. В частности, у меня есть ссылка под названием «Обзор», которая перенаправляется на обзор контроллера.Неотслеживаемое кеширование

клиента Код (HTML):

<a ui-sref="Overview">Overview</a> 

код клиента для перенаправления (угловой):

.config(function ($stateProvider, $urlRouterProvider) { 
    $urlRouterProvider.otherwise("Home/Index"); 
    $stateProvider 
     .state("Overview", { 
      templateUrl: "Home/Overview", 
      url: "/overview" 
     }) 

контроллер код:

[OutputCache(Duration=0, NoStore=true)] 
[AllowAnonymous] 
public ActionResult Overview() 
{ 
    return PartialView(); 
} 

С точки останова в строке "return PartialView()" к controller код, я вижу, что controller возвращает частичный вид, когда I cl ick «обзор» в приложении меню. Но когда я нажимаю второй раз, точка останова не срабатывает. Я думаю, что это проблема кеширования.

Я прочитал, что проблема кеширования может быть сгенерирована: * На стороне сервера. * На стороне клиента. * Даже IIS.

Я пробовал много решений: на стороне сервера я использую attribute [OutputCache]. Когда я прочитал в моем браузере заголовки HTTP я могу видеть

enter image description here

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

В качестве дополнительных мер, я ставлю в моем web.config:

<system.webServer> 
    <caching enabled="false" enableKernelCache="false" /> 
</system.webServer> 

даже, я создал свой собственный пользовательский ActionFilterAttribute но не работает.

Я не знаю, что еще делать.

PS: Извините за мой английский

ответ

1

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

Чтобы решить проблему кэширования html, вы должны добавить случайную строку запроса в конце html filename ...другие решения, о которых вы говорили, предназначены для не кэширования ответов api, а не для статического контента (html/js/css-файлы)

Чтобы добавить случайную строку запроса в ur html. либо вы можете использовать такие модули, как grunt-cache-busting или gulp-rev, или использовать строку запроса в качестве параметра query-string-cache-busting.

Пожалуйста, обратите внимание, что DATETIME/файл-хэш лучше очистки кэша парам

0

Хорошо, я нашел решение.

Несмотря на то, что вы избегаете кэширования с серверной части с атрибутами, такими как OutputCache, или избегайте кэширования из настройки IIS моего web.config, проблема сохраняется.

Угловой JS был виновным. In other post Я нашел решение.

myApp.run(function($rootScope, $templateCache) { 
    $rootScope.$on('$viewContentLoaded', function() { 
     $templateCache.removeAll(); 
    }); 
}); 

Это решение предоставлено Марком Райкоком и Валентином Шибановым. Так что благодаря обоим.

+0

Это не является хорошим решением и имеет собственные проблемы – harishr

+0

@entre я не проверил на вопрос, как правильно, так что вы можете объяснить. Я знаю, что это решение может быть несовместимо с UI-бутстрапом. [Это решение] (http://opensourcesoftwareandme.blogspot.com.es/2014/02/safely-prevent-template-caching-in-angularjs.html), похоже, решает, но не работает для меня. – robBerto

+0

точно .. если есть какой-либо другой плагин, который делает кеширует свои шаблоны, тогда это решение очистит эти шаблоны и сделает эти плагины непригодными .. Чтобы решить проблему кэширования html, вы должны добавить случайную строку запроса в конце ... решение вы упомянули для не кэширования ответов api, а не для статического содержимого – harishr

Смежные вопросы