2009-04-08 2 views
0

내 프록시 사용 : "Proxy.ashx URL ="프록시 호스트 C#을 문제

코드 :

<%@ WebHandler Language="C#" Class="Proxy" %> 

public class Proxy : IHttpHandler { 

public void ProcessRequest (HttpContext context) { 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(context.Request["url"]); 
    request.UserAgent = context.Request.UserAgent; 
    request.ContentType = context.Request.ContentType; 
    request.Method = context.Request.HttpMethod; 

    byte[] trans = new byte[1024]; 
    int offset = 0; 
    int offcnt = 0; 

    if (request.Method.ToUpper() == "POST") 
    { 
     Stream nstream = request.GetRequestStream(); 
     while (offset < context.Request.ContentLength) 
     { 
      offcnt = context.Request.InputStream.Read(trans, offset, 1024); 
      if (offcnt > 0) 
      { 
       nstream.Write(trans, 0, offcnt); 
       offset += offcnt; 
      } 
     } 
     nstream.Close(); 
    } 

    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
    { 
     context.Response.ContentType = response.ContentType; 

     using (Stream receiveStream = response.GetResponseStream()) 
     { 
      offset = 0; 
      offcnt = receiveStream.Read(trans, offset, 1024); 
      while (offcnt>0) 
      { 
       context.Response.OutputStream.Write(trans, 0, offcnt); 
       offset += offcnt; 
       if (offcnt >= 0) 
       { 
        try 
        { 
         offcnt = receiveStream.Read(trans, offset, 1024); 
        } 
        catch (Exception) 
        { 
         break; 
        } 
       } 
       else 
        break;  
      } 
     } 
     context.Response.OutputStream.Close(); 
     context.Response.Flush(); 
     response.Close(); 
    } 
} 

public bool IsReusable { 
    get { 
     return false; 
    } 
} 

}

난 항상 (Proxy.ashx 결과로 빈 페이지를 얻을? url = http://www.google.com) ... 어떤 실수를했는지 알 수 있습니까?

답변

1

POST 처리의 경우 ContentLength가 0 일 수 있으므로 사용하지 마십시오. 스트림이 더 이상 데이터를 반환하지 않을 때까지 스트림을 열고 가능한 한 많이 읽으십시오.

나머지의 경우, 배열을 읽을 때의 오프셋은 배열이 아닌 스트림의 오프셋이므로 0으로 유지되어야합니다.

using (Stream receiveStream = response.GetResponseStream()) { 
    for (int offcnt = receiveStream.Read(trans, 0, trans.Length); offcnt > 0; offcnt = receiveStream.Read(trans, 0, trans.Length)) { 
     context.Response.OutputStream.Write(trans, 0, offcnt); 
    } 
} 
+0

고마워요! "나머지는 배열을 읽을 때의 오프셋이 0이되어야합니다. 왜냐하면 오프셋은 스트림이 아니라 배열의 오프셋이기 때문입니다." 문제를 해결하기 위해 어떤 방법을 제안합니까? – Paul

+0

감사합니다. 그게 잘됐다! – Paul