2010-12-23 1 views
1

HTTP 응답을 지원하는 클라이언트에 대한 HTTP 응답을 압축하려고합니다. C# Webserver을 사용하고 있습니다.데이터를 생성하지 않는 WebHttpResponse의 GZipStream

IHttpClientContext context = (IHttpClientContext)sender; 
IHttpRequest request = e.Request; 

string responseBody = "This is some random text"; 

IHttpResponse response = request.CreateResponse(context); 

using (StreamWriter writer = new StreamWriter(response.Body)) 
{ 
    writer.WriteLine(responseBody); 
    writer.Flush(); 
    response.Send(); 
} 

위의 코드는 잘 작동 : 여기

는 표준 응답을 보내는 데 사용되는 코드입니다. 이제 아래에 gzip 지원을 추가했습니다. gzip 또는 사용자 정의 메소드를 지원하는 브라우저로 테스트하면 빈 문자열이 리턴됩니다. 내가 뭔가 단순한 누락 확신 해요,하지만 난 그냥 그것을 찾을 수 없습니다 ...

IHttpClientContext context = (IHttpClientContext)sender; 
IHttpRequest request = e.Request; 

string acceptEncoding = request.Headers["Accept-Encoding"]; 
string responseBody = "This is some random text"; 

IHttpResponse response = request.CreateResponse(context); 

if (acceptEncoding != null && acceptEncoding.Contains("gzip")) 
{ 
    byte[] bytes = ASCIIEncoding.ASCII.GetBytes(responseBody); 
    response.AddHeader("Content-Encoding", "gzip"); 

    using (GZipStream writer = new GZipStream(response.Body, CompressionMode.Compress)) 
    { 
     writer.Write(bytes, 0, bytes.Length); 
     writer.Flush(); 
     response.Send(); 
    } 
} 

else 
{ 
    using (StreamWriter writer = new StreamWriter(response.Body)) 
    { 
      writer.WriteLine(responseBody); 
      writer.Flush(); 
      response.Send(); 
     } 
} 
+0

? 사용중인 인터페이스를 인식하지 못합니다. –

+0

죄송합니다. 제 질문을 업데이트했습니다. 그것은 C# 웹 서버 : http://webserver.codeplex.com/ –

답변

1

피에르, 피에르, 피에르 ....

코드는 작동하지 않을 수 있습니다.

GZipStream은 기본 스트림에서 읽어야합니다. GZipStreamGZipStream.Dispose에 gzip 바닥 글을 작성해야하기 때문입니다.

다음 코드는 작동합니다 : 당신은 웹 서버 무엇을 사용하고있다

using (MemoryStream stream = new MemoryStream()) 
{ 
    using (GZipStream gZipStream = new GZipStream(stream, CompressionMode.Compress)) 
    gZipStream.Write(bytes, 0, bytes.Length); 

    byte[] compressed = stream.ToArray(); 
    response.Body.Write(compressed, 0, compressed.Length); 

    response.Send(); 
} 
0

어쩌면 내가 틀렸다,하지만 당신은 콘텐츠 전송-Encoding 헤더가 필요하지 않습니다? WebResponse가이를 내부적으로 제공하지 않습니까?

0

내가 결국 웹폼과 관련된 상황에서

response.Filter = new GZipStream(response.Filter, CompressionMode.Compress); 
0

를 추가하려고 :

  • 는 .NET의 Gzip으로의 구축하지만, 코드 플렉스에서 DotNetZip 라이브러리를 사용하지 않습니다. GZip 클래스를 모방 한 것처럼 쉽게 전환 할 수있었습니다.
  • 압축 된 데이터를 먼저 MemoryStream에 쓴 다음 응답 스트림에 다시 씁니다.

그러나 나는 웹 브라우저를 대상으로하지 않았습니다. HTTP를 통한 성능 테스트를 위해 압축 된 데이터를 보내는 데만 관심이있었습니다.

문제가 지저분한 부분에있는 경우 문제 해결에 도움이 될 수 있습니다. 예상대로