Есть приложение winforms на c#. Иногда оно обращается с запросами к разным интернет ресурсам, получает ответы. Можно ли как-то узнать, сколько Mb было скачано за одну сессию работы с приложением. То есть мне нужно просто узнать объем траффика через мое приложение. Спасибо
Ответ
Можно использовать счетчики производительности .NET CLR Networking. Для этого необходимо включить в раздел configuration файла app.config следующий элемент:
Счетчики позволяют получить количество байт, отправленных и полученных средствами классов .NET, для указанного процесса. Создадим вспомогательный класс:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Threading;
using System.Net;
using System.Text;
namespace WinformsTest
{
public class NetworkStats
{
const string CategoryName = ".NET CLR Networking 4.0.0.0";//В .NET 2.0-3.5 заменить на ".NET CLR Networking"
static PerformanceCounter _sentcounter = null;
static PerformanceCounter _recvcounter = null;
public static long BytesSent
{
get
{
if (_sentcounter == null) throw new InvalidOperationException("Class not initialized");
return _sentcounter.RawValue;
}
}
public static long BytesReceived
{
get
{
if (_recvcounter == null) throw new InvalidOperationException("Class not initialized");
return _recvcounter.RawValue;
}
}
public static bool Initialize()
{
//устанавливаем культуру, чтобы иметь предсказуемое имя счетчика
CultureInfo ci = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
try
{
var category = new PerformanceCounterCategory(CategoryName);
//для активации счетчиков нужно отправить хотя бы один запрос, неважно успешный или нет
try
{
WebClient cl = new WebClient();
string html = cl.DownloadString("http://example.com");
Debug.WriteLine(html.Length);
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
//получаем имя процесса
Process pr = Process.GetCurrentProcess();
string prname = "";
using (pr)
{
prname = (pr.ProcessName.ToLower());
}
var instances = category.GetInstanceNames();
//находим экземпляр счетчика для процесса
string instance = "";
foreach (string s in instances)
{
if (s.ToLower().Contains(prname)) instance = s;
}
if (instance == "") return false;
//создаем счетчики
_sentcounter = new PerformanceCounter(CategoryName, "Bytes Sent", instance, true);
_recvcounter = new PerformanceCounter(CategoryName, "Bytes Received", instance, true);
return true;
}
finally
{
//возвращаем исходную культуру
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
}
}
}
}
Пример использования:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
if (NetworkStats.Initialize() == false)
{
MessageBox.Show("NetworkStats.Initialize failed");
return;
}
timer1.Enabled = true;
}
public string PerformRequest(string url)
{
WebClient cl = new WebClient();
string html = cl.DownloadString(url);
return html;
}
private void button1_Click(object sender, EventArgs e)
{
string s = PerformRequest("http://yandex.ru");
MessageBox.Show(s.Substring(0,300));
}
private void timer1_Tick(object sender, EventArgs e)
{
textBox1.Text = "Bytes sent: " + NetworkStats.BytesSent.ToString() +
"; Bytes received: " + NetworkStats.BytesReceived.ToString();
}
}
Комментариев нет:
Отправить комментарий