#c# #asp.net #http #generic-handler
#c# #asp.net #http #универсальный обработчик
Вопрос:
У меня есть следующие строки кода из файла .ashx.
public void ProcessRequest (HttpContext context)
{
string hstr = @"Data Source=SUMAN-PCSQLEXPRESS;Initial Catalog=school;Integrated Security=True";
SqlConnection con = new SqlConnection(hstr);
string ms = context.Request.QueryString["id_image"].ToString();
con.Open();
SqlCommand cmd = new SqlCommand("select img from class where classid=" ms, con);
SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
context.Response.BinaryWrite((Byte[])dr[0]);
context.Response.End();
}
После некоторого изучения я обнаружил это
«Метод BinaryWrite отправляет определенные данные в текущий HTTP-вывод без каких-либо преобразований символов».
Что это значит? Как он отправляет данные на вывод http? Где вывод HTTP?
Комментарии:
1.Что это значит, что он говорит. Как он отправляет данные на http-вывод,
OutputStream.Write
где находится HTTP-выводHttpResponse.OutputStream
2. у меня нет OutputStream. Напишите в любом месте моего кода. итак, как работает этот Binarywrite. Куда он отправляет данные?
3. Если бы это было
OutputStream.Write
в вашем коде, вы бы не вызывалиBinaryWrite
…4. итак, что делает BinaryWrite? какова его цель?
Ответ №1:
В данном случае context.Response
это поток, представляющий данные, которые отправляются клиенту (скорее всего, веб-браузеру), который выдает http-запрос. Context.Response
предоставляется вам автоматически «движком» ASP за кулисами. Все, что вы запишете в этот поток, в конечном итоге будет отправлено в браузер.
Универсальный http-обработчик автоматически предоставляет вам экземпляр HttpContext с именем Context
. HttpContext содержит два свойства, называемые Request и Response, которые позволяют вам получить доступ к запросу, который обслуживает ваш универсальный обработчик, и соответствующему ответу. Обработчик должен выполнить любую обработку, которая ему необходима, и отправить результат, записав свой ответ в поток ответов.
Комментарии:
1. Хорошо, это полезно. ИТАК, BinaryWrite отправляет данные в браузер? Можете ли вы предоставить мне ссылку для подробного изучения, потому что я, похоже, не нахожу подходящей.
2. Что ж, в данном конкретном случае BinaryWrite отправляет данные в браузер, но BinaryWrite на самом деле является прокси-методом, который принадлежит универсальному
Stream
классу, которымResponse
управляет экземпляр для вас. Потоки на самом деле могут указывать на что угодно: файл на жестком диске, блок памяти, другой компьютер в сети или даже другой поток. Представьте потоки, подобные садовым шлангам. Вода (данные) поступает в один конец и выходит где-то в другом месте. В случаеContext.Response
движка ASP настройте все так, чтобыResponse
поток мог отправлять данные любому http-клиенту, отправившему первоначальный запрос.3. Эта статья в MSDN должна дать вам лучшее представление о том, как работают потоки в целом. msdn.microsoft.com/en-us/library /… . Необработанные потоки на самом деле не обеспечивают хорошего прямого доступа для записи данных, поэтому обычно используется некоторая форма
writer
объекта, который может датировать данные в любой имеющейся у вас форме и преобразовывать их в соответствии с потребностями потока. В этом случае создаетсяStreamWriter
, который подключается к потоку, подключенному к браузеру. HttpResponse. BinaryWrite принимает массив байтов, отправляет его в средство записи потока, которое помещает эти байты в HttpStream.4. Мне все еще не ясно. Вы сказали, что BinaryWrite() отправляет данные в браузер. Но откуда получены эти данные и как эти данные используются браузером?
5. Браузер может делать все, что захочет, с данными, которые вы ему отправляете, обычно они используются для отображения веб-страницы. В этом случае отправляемые вами данные представляют собой необработанную html-разметку для отображения страницы. Совсем недавно ajax позволил существующим страницам запрашивать данные напрямую. В случае ajax данные могут быть использованы практически для чего угодно. Все определяется тем, что JavaScript, отправивший запрос, хочет с ним сделать.