Flash Ping - ода интерфейсу Владимир Егоров aka Dr.NET Спецвыпуск Xakep, номер #030, стр. 030-054-2 После этого пишем стандартный раздел импорта. Импортируем 7 пространств имен: "System", "System.Web", "System.Text.RegularExpressions" (для проверки адреса), "System.Net", "System.Diagnostics" (для работы с процессами), "System.IO" (для работы с файлами и вводом-выводом данных) и "System.Text" (сам не дурак:))). <%@ WebHandler Language="C#" Class="Ping"%> using System; using System.Web; using System.Text.RegularExpressions; using System.Net; using System.Diagnostics; using System.IO; using System.Text; public class Ping:IHttpHandler { public bool IsReusable { get {return true;} } public void ProcessRequest(HttpContext context) { string outputText; bool OK = false; string address = context.Request["address"]; Regex rx = new Regex(@"\w+([-.]\w+)*(\.[a-z]+)+"); if (rx.Match(address).Success) OK = true; else try { IPAddress.Parse(address); OK = true; } catch (Exception) {OK = false;} if (OK) { Process p = new Process(); p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.FileName = "d:\\winnt\\system32\\ping.exe"; p.StartInfo.Arguments = address+" -n 1"; p.Start(); outputText = "p=\""+p.StandardOutput.ReadToEnd()+"\""; p.WaitForExit(); p.Dispose(); } else outputText = "p=\"Неверный адрес!\""; FileStream fs = File.Create("D:\\Inetpub\\wwwroot\\Handler\\output.txt"); StreamWriter sw = new StreamWriter(fs,Encoding.GetEncoding(1251)); sw.Write(outputText); sw.Close(); fs.Close(); context.Response.ContentType="text/html"; context.Response.Write("<html><head><script language=\"javascript\">self.close()</script></head></html>"); } } Для того чтобы сделать WebHandler, мы должны создать новый класс "Ping", который реализует интерфейс IHttpHandler, содержащийся в пространстве имен "System.Web". Интерфейс IHttpHandler содержит всего одно свойство типа bool (IsReusable) и один метод ProcessRequest(HttpContext context), который собственно и выполняет обработку запроса. Итак, создаем класс "Ping" и через двоеточие указываем, что он унаследован от интерфейса IHttpHandler. Затем создаем поле IsReusable, доступное только для чтения и содержащее значение true (данная хрень указывает, может ли другой запрос повторно использовать тот же экземпляр WebHandler'а). Теперь реализуем метод ProcessRequest. Сначала создадим две переменные: "outputText" и "OK". В первую засунем текстовый вывод :), который будет потом записан в файл, а во вторую - показатель, все ли нормально с адресом. После этого получаем значение адреса для пинга из переменной context.Request["address"]. После этого проверяем адрес на правильность с помощью регулярного выражения "\w+([-.]\w+)*(\.[a-z]+)+", которое соответствует полному доменному имени. Проверку IP-адреса будем производить с помощью метода IPAddress.Parse(string address), перехватывая возможное при вызове этого метода исключение. Если с адресом все ОК, то осталось запустить процесс "ping.exe" и перенаправить его вывод в текстовый файл. |