2010-12-21 4 views
0

나는 이것에 꽤 많은 시간을 보냈지만 아무데도 가지 않는 것처럼 보인다. 나는 정말로 속도를 내고 싶은 큰 페이지를 가지고있다. 시작하기에 명백한 장소는 HTTP 압축 인 것 같지만, 나는 그것이 나를 위해 일하도록 할 수없는 것 같습니다.누구나 ASP.NET에서 HTTP 압축을 사용할 수 있습니까?

상당한 검색을 거친 후 아래에서 여러 가지 변형 된 코드를 시도해 보았습니다. 일종의 작품이지만, 브라우저를 새로 고친 후에 결과가 떨어져 나간 것처럼 보입니다. 페이지가 캐싱을 사용할 때 그들은 쓰레기로 변하고있었습니다. 캐싱을 해제하면 페이지가 올바르게 보이지만 별도의 파일에 저장된 CSS 서식이 손실되어 포함 된 JS 파일에 잘못된 문자가 포함되어 있다는 오류가 발생합니다.

웹에서 찾은 대부분의 리소스는 매우 오래되었거나 IIS에 직접 액세스하는 데 중점을 둡니다. 내 페이지가 공유 호스팅 계정에서 실행 중이며 실행중인 IIS7에 직접 액세스 할 수 없습니다.

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    // Implement HTTP compression 
    if (Request["HTTP_X_MICROSOFTAJAX"] == null) // Avoid compressing AJAX calls 
    { 
     // Retrieve accepted encodings 
     string encodings = Request.Headers.Get("Accept-Encoding"); 
     if (encodings != null) 
     { 
      // Verify support for or gzip (deflate takes preference) 
      encodings = encodings.ToLower(); 
      if (encodings.Contains("gzip") || encodings == "*") 
      { 
       Response.Filter = new GZipStream(Response.Filter, 
        CompressionMode.Compress); 
       Response.AppendHeader("Content-Encoding", "gzip"); 
       Response.Cache.VaryByHeaders["Accept-encoding"] = true; 
      } 
      else if (encodings.Contains("deflate")) 
      { 
       Response.Filter = new DeflateStream(Response.Filter, 
        CompressionMode.Compress); 
       Response.AppendHeader("Content-Encoding", "deflate"); 
       Response.Cache.VaryByHeaders["Accept-encoding"] = true; 
      } 
     } 
    } 
} 

아무에게도 더 좋은 성과가 있습니까?

답변

1

나는 Response.Filter 속성에 익숙하지 않지만 GZipStreamDeflateStream을 사용하여 좋은 결과를 직접 출력했습니다. 이것을 소용돌이 치게하십시오 :

string response = "your output body"; 
string accept = Request.Headers["Accept-Encoding"]; 
if(accept == null) accept = ""; 
if (response.Length < 100 || !(accept.Contains("deflate") || accept.Contains("gzip"))) 
    Response.Write(response); 
else 
{ 
    byte[] compressed; 
    bool useDeflate = accept.Contains("deflate"); 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     using (Stream deflate = useDeflate 
      ? (Stream)new DeflateStream(stream, CompressionMode.Compress, true) 
      : (Stream)new GZipStream(stream, CompressionMode.Compress, true)) 
     using (StreamWriter writer = new StreamWriter(deflate)) 
      writer.Write(response); 
     compressed = new byte[stream.Length]; 
     stream.Position = 0; 
     stream.Read(compressed, 0, compressed.Length); 
    } 
    Response.Headers["Content-Encoding"] = useDeflate ? "deflate" : "gzip"; 
    Response.BinaryWrite(compressed); 
} 
+0

이것도 Application_BeginRequest()에 있습니까? –

+0

슬프게도 한 ASP.Net 프로젝트에서 만 작업했습니다.이 .ashx IHttpHandler 문제는 원할 경우 전체 응답 본문을 문자열로 처리 할 수있게 해줍니다. 나는 이것이 정규 .aspx 페이지에서 어떻게 이루어 졌는지 정말로 모른다. 다른 C#은 Win32의 것들입니다. ASP.Net에 일종의 출력 버퍼링 메커니즘이있는 경우이 코드는 플러시되기 전에 처리 할 것입니다. 미안해 더 구체적 일 수는 없어! –

관련 문제