2017-02-17 22 views
1

Мое выходное кэширование не работает должным образом Это метод контроллера, который возвращает страницу по умолчанию для моего сайта. я кэшировать его для 40secs (тест -> в прямом эфире он кэшируется гораздо дольше)OutputCache не работает правильно -> ASP.NET MVC5

[OutputCache(Duration = 40, Location = OutputCacheLocation.ServerAndClient, VaryByParam = "none")] 
public async Task<ActionResult> Index(){ 
...... 
} 

У меня есть 2 проблемы

Первый

Когда я попал в конечную точку для первой время, которое оно кэшируется правильно на сервере и возвращает следующий заголовок ответа (как и ожидалось) среди других.

status:200 
Cache-Control:"private, max-age=40, s-maxage=0" 

Когда я открываю новую вкладку браузера и вставляю ее в ту же конечную точку через 5 секунд. он отправляется на сервер и возвращает 200 с содержимым, а следующий заголовок

status:200 
Cache-Control:"private, max-age=63622944145, s-maxage=63622944105" 

Это не похоже на меня. Я ожидал, что он отправит запрос на сервер с заголовком If-modified-since. Если кешированный ответ был перестроен с момента времени в заголовке, он вернул бы 200 + содержимое else 304. Таким образом, в этом случае, когда кеш-сервер не был перестроен, он должен вернуть 304. Также, поскольку максимальный возраст настолько велик он теперь недействителен и поэтому сразу считается устаревшим. Так что я делаю неправильно ...?

Во-вторых

я поставил точку останова в мой метод индекса и попал в конечную точку из браузера. В первый раз, когда я попал в конечную точку Индекса, точка останова попала. Последующие запросы к конечной точке не попадают в точку останова в течение следующих 40 секунд, как ожидалось. Однако, если я добавлю «/» в конец моей конечной точки в браузере, он попадет в точку останова, игнорируя кеш. Как этого избежать?

+0

Что касается второй половины вашего вопроса, URL «http://www.example.com» и «http://www.example.com/» , с /, - разные страницы. Вам нужно будет иметь модуль перезаписи URL в Web.Config, если вы хотите, чтобы к обоим относились одинаково. Я изменю свой ответ ниже. – kodikas

ответ

0

У меня была эта проблема. Там есть нить на GitHub здесь (я думаю, что это ошибка): https://github.com/Microsoft/dotnet/issues/330

Решение для меня было следующим образом: (1) Скачать и установить .Net Framework 4.6.2 Dev пакет. Перейдите на страницу «Свойства» вашего проекта и выберите его в списке или перейдите в «Установка других рамок» ... (2) Настройте приложение на 4.6.2. Вам нужно будет перезапустить проект (у него есть сообщение). (3) Перейти к web.config и обеспечить эти значения устанавливаются:

<system.web> 
<compilation targetFramework="4.6.2" /> 
<httpRuntime targetFramework="4.6.2" /> 

(4) И, наконец, перейти к NuGet установщика пакетов и установите следующий пакет (поиск для него): Microsoft .AspNet.OutputCache.OutputCacheModuleAsync

Проблема была исправлена ​​для меня. Надеюсь, это поможет.

Вопрос 2: Удаление задней слэш

Добавьте этот код в Интернете.конфигурации в соответствующем разделе:

<system.webServer> 
<rewrite> 
    <rules> 
    <rule name="Remove trailing slash" enabled="true" stopProcessing="true"> 
     <match url="(.*)/$" /> 
     <conditions> 
     <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
     <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
     </conditions> 
     <action type="Redirect" redirectType="Permanent" url="{R:1}" /> 
    </rule> 
    </rules> 
</rewrite> 
<validation validateIntegratedModeConfiguration="false" />