Есть бредовая страничка на ASP.net, эксперимент так сказать, суть ее в следующем, она принимает параметры с url (u-url, s-стартовый байт, e-последний байт), после чего загружает нужные байты из указанного по url файла и кодирует их в base64, после чего текст выводит в response в качестве ответа.
все в отладке работает отлично до выхода из процедуры Load(), далее браузер должен получать ответ и просто вывести это на странице, с простым текстом проблем нет, но тут почемуто браузер зависает насмерть и иногда тянет за собой и студию (загрузка ЦП =0), что может быть не так? (не считая бредовости затеи, но уверяю в этом есть сакральный смысл)
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string url="";
string start_s="";
string end_s="";
Response.Clear(); // clear response buffer
if (Request.QueryString["u"] != null)
{
url = Request.QueryString["u"];
}
if (Request.QueryString["s"] != null)
{
start_s = Request.QueryString["s"];
}
if (Request.QueryString["e"] != null)
{
end_s = Request.QueryString["e"];
}
if (url!="")
{
int start = 0;
int end = 0;
if (int.TryParse(start_s, out start))
{
if (int.TryParse(end_s , out end))
{
if (Download(url,start,end))
{
Response.End();
return;
}
else
{
Response.Clear();
Response.End();
return;
}
}
}
}
//Response.Write();
//Response.Write("test"); // write your new text
Response.End();
}
private bool Download(string url, int start,int end)
{
try
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
//string proxyIp = "8080";
//string proxyPort = "127.0.0.1";
//string urlProxy = "http://127.0.0.1:8080/";
//WebProxy proxyObject = new WebProxy(urlProxy);
//req.Proxy = proxyObject;
req.Timeout = 5000;
req.ReadWriteTimeout = 5000;
byte[] buffer;
//req.UseDefaultCredentials = true;
//req.Proxy = new WebProxy();
//req.Timeout = 1000;
req.Method = "GET";
req.AddRange(start, end); // запрашиваем диапазон в первые 1001 байт
var resp = req.GetResponse();
var stream = resp.GetResponseStream();
//stream.ReadTimeout = 8000;
//stream.Read(buffer, 0, (int)(end - start));
int contentLength = Convert.ToInt32(resp.ContentLength);
buffer = StreamToByteArray(stream, contentLength / 10, contentLength);
string response = GetResponseString(buffer);
stream.Close();
resp.Close();
buffer = null;
Response.Write(response);
return true;
}
catch (Exception)
{
Response.Clear();
return false;
}
}
public string GetResponseString(byte[] data)
{
string temp_inBase64 = Convert.ToBase64String(data);
return temp_inBase64;
}
public byte[] GetDataFromB64(string response)
{
byte[] temp_backToBytes = Convert.FromBase64String(response);
return temp_backToBytes;
}
public Stream ConvertToBase64(Stream stream)
{
Byte[] inArray = new Byte[(int)stream.Length];
Char[] outArray = new Char[(int)(stream.Length * 1.34)];
stream.Read(inArray, 0, (int)stream.Length);
Convert.ToBase64CharArray(inArray, 0, inArray.Length, outArray, 0);
return new MemoryStream(Encoding.UTF8.GetBytes(outArray));
}
byte[] StreamToByteArray(Stream stream, int initialLength, int chunksize)
{
// If we've been passed an unhelpful initial length, just
// use 32K.
if (initialLength < 1)
{
initialLength = 32768;
}
byte[] buffer = new byte[initialLength];
int read = 0;
int chunk;
int last = 0;
while ((chunk = stream.Read(buffer, read, buffer.Length - read)) > 0)
{
read += chunk;
// If we've reached the end of our buffer, check to see if there's
// any more information
double d = (double)read;
d = d / (double)(chunksize);
d = d * 100;
d = Math.Ceiling(d);
if (d - last > 10)
{
last = (int)(d);
}
if (read == buffer.Length)
{
int nextByte = stream.ReadByte();
// End of stream? If so, we're done
if (nextByte == -1)
{
return buffer;
}
// Nope. Resize the buffer, put in the byte we've just
// read, and continue
byte[] newBuffer = new byte[buffer.Length * 2];
Array.Copy(buffer, newBuffer, buffer.Length);
newBuffer[read] = (byte)nextByte;
buffer = newBuffer;
read++;
}
}
// Buffer is now too big. Shrink it.
byte[] ret = new byte[read];
Array.Copy(buffer, ret, read);
return ret;
}
}
}