2016-08-22 5 views
6

내 MVC 사이트에서 내 페이지를 제공하는 데 적합한 접근 방식으로 51도를 사용하고 있습니다. 모두 잘 작동합니다.휴대 기기가 데스크톱 사이트를 요청하고 있는지 확인하십시오.

나는 최근에 출력 캐싱을 추가하고 나는 모바일 또는 데스크톱 여부를 확인하기 위해 VaryByCustom를 사용

: 나는 최초의 모바일 사용자가 사이트를 탐색 할 경우는 문제로 실행 한 그러나

public override string GetVaryByCustomString(HttpContext context, string custom) 
    { 
     // this is for the output cache 
     if (context != null) 
     { 
      switch (custom) 
      { 
       case "Mobile": 
        return GetMobileCustomString(context); 
      } 
     } 

     return base.GetVaryByCustomString(context, custom); 
    } 

    private static string GetMobileCustomString(HttpContext context) 
    { 
     if (context.Request.Browser.IsMobileDevice) 
     { 
      return "IsMobile"; 
     } 
     else 
     { 
      return "IsDesktop"; 
     } 
    } 

요청했다 데스크톱 버전에서는 모든 모바일 사용자에게 캐시됩니다.

GetMobileCustomString을 변경하여 데스크톱 사이트를 요청하는 모바일인지 확인해야합니다. 이 일을 할 수있는 방법이 있습니까? 이 아니었다 내가 가진 것처럼 바탕 화면 페이지를 일으키는 첫 번째로드가 캐시 할, 첫째

: 현상금이 일에 오픈 한 바와 같이

업데이트

, 나는 내가 업데이 트를 제공 할 것이라고 생각 처음에는 생각했기 때문에 많은 검색, 연구 및 테스트를 해본 결과, 모바일 페이지 (MVC 5에있는 경우)에 대해 데스크톱 페이지를 캐시해서는 안됩니다. 나는 모바일 요청을 할 때 코드를 밟았으며 사용자 정의에 따라 다양하게 변하면 context.Request.Browser.IsMobileDevicefalse으로 표시합니다.

모바일 사이트를 위해 데스크톱 사이트가 캐싱되는 원인을 잘 모름 - 아마도 bug in MVC 4의 숙취입니다. 그냥 무작위로 (즉, 언젠가는 괜찮을 것이고 다음에 어떤 이유로 데스크톱 사이트를 제공 할 다른 날이 될 것입니다.) 앱 풀 재활용은 항상 문제를 해결할 것입니다.

나는 또한 내가 사용하여 오버라이드 (override) 브라우저를 얻을 수 있다는 것을 발견

using System.Web.Wepages; 

context.Request.RequestContext.HttpContext.GetOverriddenBrowser(); 

그러나이 많이 사용 될 것 같지 않았다

그것은 당신이 작동해야하는 일처럼 날 것으로 보인다
+0

데스크톱/모바일 앱 및 요청을 변경할 수있는 권한이 있습니까? 어쩌면 당신은 HTTP 요청의 사용자 에이전트를 설정하고 그것을 읽을 수 있습니다. –

+1

내장 된 방법이 없으므로 검색 할 때 브라우저를 명시 적으로 설정할 수있는 곳을 찾았습니다. http://stackoverflow.com/questions/16080593/mvc4-force-mobile-site-for-all- 요청 (데스크톱 포함). 당신이 그것을 설정할 수 있다면, 그것을 얻을 수있는 방법이 없을까요? – Pete

+0

hmmm, 그 브라우저 오버라이드에 대해 더 많은 것을 보았을 때 오버 라이드가 단지 const 문자열에 의해 설정되는 것 같습니다 : https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web .WebPages/BrowserHelpers.cs – Pete

답변

0

, 클라이언트쪽에 캐시를 저장해야합니다.

다음과 같은 방식으로 컨트롤러 액션에 OutputCache를 속성을 사용해야

:

[OutputCache(Duration = 5, VaryByCustom = "Mobile", Location = OutputCacheLocation.Client)] 

(기간은 당신에게 달려있다)

말했다되고 있다는 브라우저 감지는 HTTP를 기반으로 헤더 요청하는 브라우저가 다른 에이전트의 헤더를 보내는 경우에는 아무 도움이되지 않습니다.

다른 옵션은 대신 기능 감지를 사용하는 것입니다.

도움이 되었기를 바랍니다. 51degrees.config 내

0

거기에 설정

<redirect devicesFile="" timeout="20" firstRequestOnly="true" 

이 firstrequestonly 혼동 될 수 있습니다 캐싱 있도록 시스템이 첫 번째 요청으로 최초의 모바일 장치를 치료하고, 원래의 동일한 세션 다른 모든 모바일 휴대 기기. 이것을 false로 설정하여 문제가 해결되는지 확인하십시오.