xNet - библиотека классов под .NET Framework

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by X-rus, 12 May 2011.

  1. X-rus

    X-rus Member

    Joined:
    22 Dec 2010
    Messages:
    88
    Likes Received:
    22
    Reputations:
    4
    xNet - библиотека классов для .NET Framework

    ОБЩИЕ СВЕДЕНИЯ

    • ЯП: C#
    • Версия: 3.0
    • Версия .NET: 4.0 Client Profile
    • Документация: XML на русском
    • Исходный код: github.com/X-rus/xNet
    • Актуальная информация: habrahabr.ru/post/146475/

    ОПИСАНИЕ

    xNet - это библиотека классов для .NET Framework, которая включает в себя:
    • Классы для работы с прокси-серверами: HTTP, Socks4(a), Socks5, Chain.
    • Классы для работы с HTTP 1.0/1.1 протоколом: keep-alive, gzip, deflate, chunked, SSL, прокси и другое.
    • Классы для работы с многопоточностью: многопоточный обход коллекции, асинхронные события и другое.
     
    #1 X-rus, 12 May 2011
    Last edited: 18 Mar 2013
    z668, seregahowe, ChymeNik and 4 others like this.
  2. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    т.е. автор ты?
    я могу поучавствовать и вообще заценить сорсы, когда отрезвею :)

    В общем стукни в аську 1501075, хочу принять участие
     
    #2 GhostOnline, 12 May 2011
    Last edited: 12 May 2011
  3. X-rus

    X-rus Member

    Joined:
    22 Dec 2010
    Messages:
    88
    Likes Received:
    22
    Reputations:
    4
    Да.

    Ок. Позже отпишу. Пока можешь ознакомиться с библиотекой. :)
     
  4. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    При работе с CONNECT проксиком надо посылать "Proxy-Connection: keep-alive".
    А по сабжу много чего лишнего, профилирования делал?
    Как ведет себя скажем на потоках 200-500?
     
    #4 seosimf, 12 May 2011
    Last edited: 12 May 2011
  5. X-rus

    X-rus Member

    Joined:
    22 Dec 2010
    Messages:
    88
    Likes Received:
    22
    Reputations:
    4
    Спасибо за подсказку. Наверное, сделаю так, если в HttpRequest стоит KeepAlive = true и используется HttpProxy, то будет отправляться заголовок "Proxy-Connection: keep-alive".

    Я ещё вот думаю насчёт аутентификации на HttpProxy. На данный момент, если она нужна, то при подключение к прокси-серверу, отправляется команда CONNECT, с параметрами аутентификации, но ведь прокси-сервер может не поддерживать метод CONNECT.
    Лучше тогда сделать, чтобы при каждом запросе к прокси серверу, отправлялись данные аутентификации?

    Почему же? Я все эти классы, так или иначе, использую.

    Нет.
     
  6. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    Нет, видать ты меня не совсем правильно понял, Proxy-Connection: keep-alive нужно отправлять самому прокси серверу в обязательном порядке, если этого не делать то прокси сервер тупо закрывает конект и писать HTTP запрос в socket уже бесполезно, столкнулся с этим когда юзал http://www.starksoft.com/prod_proxy.html да и когда писал свой класс, то есть:
     
  7. X-rus

    X-rus Member

    Joined:
    22 Dec 2010
    Messages:
    88
    Likes Received:
    22
    Reputations:
    4
    Аа. Эта проблема у меня решена. HttpRequest проверяет заголовки на наличие Connection: close или Proxy-Connection: close. Именно их посылают, если хотят закрыть соединение. И, если они присутствуют, то автоматически вызывается метод Dispose (для закрытия соединения), и при следующем запросе создаётся новое соединение.
     
  8. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Рекомендую побольше использовать методы-расширения для интерфейсов (отличный пример как это в System.Linq сделано)
    Напрмиер:
    Code:
    static public void SaveToFile(this IEnemurable<string> source, string fileName);
    
    А вызывать так:

    Code:
    var list = new List<string>();
    ......
    list.SaveToFile("test.txt");
    Идея понятна? Просто код так почитабельнее выглядит, чем вызовы статических методов
     
  9. X-rus

    X-rus Member

    Joined:
    22 Dec 2010
    Messages:
    88
    Likes Received:
    22
    Reputations:
    4
    Ну, я их и так использовал по возможности. Примеры:
    Code:
    public static string[] Substrings(this string str, string left, string right, StringComparison comparsion)
    
    public static string GetNodeValue(this XmlDocument xmlDocument, string xpath)
    

    Новое, достаточно весомое, обновление библиотеки. Все подробности расписаны в документации.

    Версия 1.1.0
    • В классе AsyncEvent обновлён метод AsyncCall.
    • В класс MultiThreading добавлено новое событие - CancelingWork.
    • Добавлено новое исключение - NetException. Теперь от него наследуются HttpException и ProxyException.
    • Класс ProxyClient реализует интерфейс IEquatable и переопределяет стандартные методы object.
    • В HttpProxyClient доработан метод подключения к серверу.
    • HttpHeaders и HttpCookies теперь наследуются от SortedDictionary.
    • В HttpResponse добавлен индексатор для доступа к HTTP-заголовкам.
    • Из HttpResponse убраны свойства Content-Length, Content-Encoding и Content-Type.
    • Из HttpRequest убрано свойство Accept.
    • В HttpRequest добавлено автоопределение кодировки.
    • В HttpRequest добавлена поддержка Basic-авторизации.
    • В HttpRequest улучшены методы загрузки страниц, в особенности страниц неизвестной длинны.
    • В HttpRequest добавлена дополнительная поддержка протокола HTTP 1.0. Теперь, при KeepAlive = true, отправляется заголовок Connection: keep-alive, а при использование HTTP-прокси, отправляется Proxy-Connection: keep-alive.
    • И другие внутренние доработки.


    Данное обновление в основном коснулось классов из xNet.Threading. Все подробности расписаны в документации.

    Версия 1.1.3
    • Доработан класс MultiThreading.
    • Полностью переделан класс AsyncEvent.
    • Добавлены методы расширения для классов DirectoryInfo и FileInfo.
    • В классы Synchronized и SynchronizedRW добавлен метод SetAndGetValue.
    • Класс SynchronizedRW реализует интерфейс IDisposable, и добавлен метод CreateLock.
    • Методы UrlDecode и UrlEncode в классе HttpUtility, теперь используют по-умолчанию кодировку UTF8.
    • Добавлен перегруженный метод MultiFormDataFile в класс HttpMime, который самостоятельно загружает данные из файла.
    • Добавлены перегруженные методы Post в классы HttpRequest и HttpClient, которые позволяют отправлять 'сырые' данные HTTP-серверу.
     
    #9 X-rus, 13 May 2011
    Last edited by a moderator: 27 Mar 2013
  10. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Это все написано с нуля, полностью с использованием Winsock функций?
     
  11. X-rus

    X-rus Member

    Joined:
    22 Dec 2010
    Messages:
    88
    Likes Received:
    22
    Reputations:
    4
    Да, с использованием стандартных .NET библиотек.
     
  12. StarJIeu

    StarJIeu New Member

    Joined:
    4 Apr 2011
    Messages:
    3
    Likes Received:
    1
    Reputations:
    0
    А что случилось с сайтом? =) если сайт загнулся не могли бы перезалить файлы плиз
     
  13. X-rus

    X-rus Member

    Joined:
    22 Dec 2010
    Messages:
    88
    Likes Received:
    22
    Reputations:
    4
    Сайт временно закрыт. Уже есть тестовая версия второй части библиотеки. Там всё было переписано и добавлено новое.

    Версия 1.9.2: http://rghost.ru/25631501

    Пример:
    Code:
                using (HttpRequest request = new HttpRequest())
                {
                    request.UserAgent = HttpHelper.RandomUserAgent();
                    request.Proxy = Socks5ProxyClient.Parse("127.0.0.1:1080");
    
                    StringDictionary reqParams = new StringDictionary();
    
                    reqParams["username"] = HttpHelper.UrlEncode("USERNAME");
                    reqParams["password"] = HttpHelper.UrlEncode("PASSWORD");
    
                    string content = request.Post("http://microsoft.com/hack.php", reqParams).LoadText();
    
                    string secretHash = content.Substring("secret_hash=\"", "\"");
                    secretHash = HtmlHelper.ReplaceEntities(secretHash);
                }
    Для загрузки тела сообщения, нужно использовать три метода: LoadBytes, LoadText или Ignore. Остальное можно почитать в документации, особенно следует читать Remarks (заметки). О всех ошибках и недачётах желательно сообщать мне. :)



    Релиз 2.0 уже доступен, смотрите первый пост. Также, смотрите мой блог, там есть статьи по xNet. ;)



    Библиотека обновлена до версии 2.1.1. Ещё появилась новая библиотека для работы с Вконтакте API и статья по работе с ней, и не только: Работа с Вконтакте API & Файлообменник Вконтакте




    Теперь исходный код библиотеки доступен на GitHub: https://github.com/X-rus/xNet




    Дополнительную информацию о библиотеки можете получить на моём сайте. :cool:
     
    #13 X-rus, 15 Oct 2011
    Last edited by a moderator: 27 Mar 2013
    1 person likes this.
  14. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Спасибо за код. Отличный вариант, чтобы в деталях изучить работу с сетью в C#.
     
  15. zoke

    zoke Member

    Joined:
    5 Sep 2010
    Messages:
    90
    Likes Received:
    9
    Reputations:
    5
    несколько примеров не плохо было бы увидеть
     
  16. X-rus

    X-rus Member

    Joined:
    22 Dec 2010
    Messages:
    88
    Likes Received:
    22
    Reputations:
    4
    Они есть на сайте.
     
  17. mojaev

    mojaev Member

    Joined:
    3 Jan 2009
    Messages:
    15
    Likes Received:
    22
    Reputations:
    0
    Примеры тут http://blog.epicsoft.ru/
     
  18. _Spamer_

    _Spamer_ Elder - Старейшина

    Joined:
    3 Feb 2009
    Messages:
    83
    Likes Received:
    140
    Reputations:
    16
    Сайт автора не работает=\ Интересно было бы статейки почитать, мб у кого-то сохраненные остались?)
     
  19. X-rus

    X-rus Member

    Joined:
    22 Dec 2010
    Messages:
    88
    Likes Received:
    22
    Reputations:
    4
    Актуальная информация о библиотеки теперь находится здесь - habrahabr.ru/post/146475/
    А исходный код здесь - github.com/X-rus/xNet


    Вышла новая версия: 3.0

    Были удалены лишние классы и доработаны старые. Добавлена поддержка подключений через цепочку из проксей. Расширены возможности работы с HTTP. Ну и ещё всякое. :)

    Статья на хабре была обновлена. Там есть вся необходимая информация.
     
    #19 X-rus, 11 Dec 2012
    Last edited by a moderator: 27 Mar 2013
  20. агерон

    агерон New Member

    Joined:
    24 Oct 2009
    Messages:
    4
    Likes Received:
    3
    Reputations:
    5
    Тихий ужас... читать классиков программирования "Шаблоны проектирования" Банды Четырех и "Рефакторинг" Мартина Фаулера, может тогда ситуация исправиться, эти исходники можно выкинуть на помойку т. к. поддерживать их сможет только автор и никто другой