2017-02-17 10 views
1

내 출력 캐싱이 예상대로 작동하지 않습니다. 내 웹 사이트의 기본 페이지를 반환하는 컨트롤러 메서드입니다. 내가 40secs 위해 캐시 된 한 - 내가 처음에 대한 엔드 포인트를 칠 때 나는이 문제OutputCache가 올바르게 작동하지 않습니다 -> ASP.NET MVC5

먼저

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

(테스트> 라이브에서 훨씬 이상 캐시) 서버에서 올바르게 캐시 된 다음 예상대로 다음 응답 헤더를 반환합니다.

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 헤더를 사용하여 서버에 요청을 보낼 것으로 예상했습니다. 캐시 된 응답이 헤더의 시간 이후에 다시 작성된 경우 304 + 내용을 반환합니다 (304). 따라서이 경우 서버 캐시가 다시 작성되지 않으므로 304를 반환해야합니다. 또한 최대 수명이 너무 길기 때문에 그것은 현재 유효하지 않으며 따라서 즉시 부실로 간주됩니다. 그래서 내가 뭘 잘못하고 있니?

둘째

내 색인 방법에 중단 점을 넣어 내 브라우저에서 엔드 포인트를 기록했다. 처음으로 인덱스 끝점에 도달했을 때 중단 점에 도달했습니다. 엔드 포인트에 대한 후속 요청은 예상대로 다음 40 초 동안 중단 점에 도달하지 않습니다. 그러나 브라우저에서 내 끝점에 "/"를 추가하면 캐시를 무시하는 중단 점에 도달합니다. 이 문제를 어떻게 피할 수 있습니까?

+0

질문, URL에 'http://www.example.com'와 'http://www.example.com/'의 후반에 대해서 /는 다른 페이지입니다. Web.Config에 URL 재 작성 모듈이 있어야 모두를 똑같이 처리 할 수 ​​있습니다. 아래에서 내 대답을 수정하겠습니다. – kodikas

답변

0

방금 ​​같은 문제가있었습니다. 여기 GitHub의에 스레드 (나는 그것이 버그 생각이)있다 : https://github.com/Microsoft/dotnet/issues/330

다음과 같이 나를 위해 솔루션을했다 : (1) 닷넷 4.6.2 데브 프레임 워크 팩을 다운로드하고 설치합니다. 프로젝트의 속성 페이지로 이동하여 목록에서 선택하거나 다른 프레임 워크 설치 ... (2) 앱을 4.6.2로 지정하십시오. 프로젝트를 다시 시작해야합니다 (메시지가 있음). (3)의 web.config로 이동이 값이 설정되어 있는지 확인 :

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

(4) 마지막으로, NuGet 패키지 설치로 이동합니다 (검색) 다음과 같은 패키지를 설치 : 마이크로 소프트 .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" />