Бінарна серіалізация HTTP за допомогою ASP.NET без використання WCF

При розробці програми типу клієнт / сервер вам часто може знадобитися послати об'єкт вашому клієнтові. Найбільш легким шляхом для програміста при роботі з об'єктом є отримання всього об'єкта з сервера, а не тільки деяких властивостей. Одним із способів виконання цього є використання WCF або Веб-сервісів, що надає вам великий набір інструментів, таких як серіалізация. Однак ці набори технологій часто привносять чимало перевитрат і складнощів у ваш проект, чого вам напевно не хотілося б бачити у випадках, коли вам необхідно просто переслати і отримати один або більше об'єктів.

При такій дилемі варто було витратити деякий час на пошук рішення. Нашою метою було знаходження простого і ясного методу створення об'єкта на сервері, його серіалізация і відсилання назад до клієнта. Безпека і функціональна сумісність не входили до списку завдань, але вони можуть бути реалізовані пізніше. Обмеженням було те, що нам необхідно було швидке рішення, і воно повинно було працювати за допомогою стандартного HTTP-протоколу.

Рішення полягає у створенні ASP.NET-сторінки, яка зчитує рядок запиту для визначення того, який об'єкт необхідно повернути, створює його, серіалізуются його в двійковий формат і повертає в вигляді двійкового додатка до клієнта. Клієнт завантажує файл за допомогою класу WebClient () і перетворює його з послідовної форми в об'єкт.

Як клієнт, так і сервер використовують бібліотеку класів, містить загальний об'єкт. Спочатку ми реалізували це за допомогою XML-серіалізациі, але вона виявилася досить повільною, але тим не менше ви можете її використовувати при необхідній функціональної сумісності.

Пояснення

Вам варто пам'ятати про те, що це не єдиний спосіб – ви напевно можете виконати це за допомогою WCF, використовуючи спеціалізовану прив'язку або MTOM, але нам здається, що дані методи надто залучені і привносять непотрібну складність в прості проекти.

Використання коду

При завантаженні сторінки веб-сервера ми включаємо наступний код для перевірки того, який об'єкт вимагає клієнт, і повертаємо об'єкт, перетворений в двійкове додаток.
protected void Page_Load(object sender, EventArgs e)
{
/ / Перевірка того, який об'єкт необхідний клієнту
    if (Request.QueryString[“op”] == “getdata”)
    {
/ / Створення нового екземпляра об'єкта з вибірковими даними
        var data = new SampleData();
        data.moreData = 34343;
        data.otherData = true;
        data.SomeData = “fewoifjweofjwepo”;
/ / Установка типу вмісту і заголовка
/ / Байтовий потік дозволяє нам посилати дані бінарного типу
/ / Назва файлу тут не ставиться до справи так як насправді
/ / Він не використовується клієнтом
        Response.ContentType = “application/octet-stream”;
        Response.AppendHeader(“Content-Disposition”,
"Attachment; filename = sampleData.bin");
/ / Серіалізация об'єкта і запис його в у відповідь потік
        var binaryFormatter = new BinaryFormatter();
        binaryFormatter.Serialize(Response.OutputStream, data);
/ / Важливо завершити відповідь, інакше клієнту буде надіслано інші дані сторінки
            Response.End();
    }
З боку клієнта ми створили запит до сервера використовуючи рядок запиту і перетворили відповідь.
 / / Створення посилання для сервісу, вона може бути збережена у файлі конфігурації
string url = "http://localhost/BinaryServiceSample/Default.aspx?op=getdata";
/ / Закрузка даних у бітовий масив
/ / Ці дані містять реальний об'єкт
var client = new WebClient();
byte[] result = client.DownloadData(url);
/ / Створення потоку даних для зберігання об'єкта
var mem = new MemoryStream(result);
var binaryFormatter = new BinaryFormatter();
var data = (SampleData)binaryFormatter.Deserialize(mem);
mem.Close();
/ / Запис об'єкта в консоль
Console.Write(data.ToString());
Console.ReadLine();

Цікаві факти


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*