|

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" и перенаправить его вывод в текстовый файл.
Назад на стр. 030-054-1 Содержание Вперед на стр. 030-054-3
|