Генерация HTTP запросов с использованием C#: основные принципы и примеры

История появления ASP.NET

Свое начало платформа ASP.NET берет на заре интернета — в 1990-х годах. Первые веб-страницы сугубо информативными и поэтому статическими. Но довольно быстро возникла необходимость добавлять в них интерактивные элементы. Например, формы для отправки данных на сервер, чаты или корзины для покупок.

Курс Frontend.
Frontend розробник може легко створити сторінки вебсайту чи вебдодаток. Тому після курсу ви станете затребуваним фахівцем у сфері, що розвивається.
Інформація про курс

Тогда Microsoft начали разрабатывать инструменты для проектирования динамических веб-страниц. Как результат, в 1996 году компания выпустила первую версию Active Server Pages (ASP). Это была серверная платформа для создания динамических веб-страниц на языке скриптов VBScript или JScript.

Сначала первая версия ASP была довольно популярной, но спустя несколько лед устарела и перестала удовлетворять современным (на то время) требованиям веб-разработки. Поэтому в 2000 году Microsoft начали работу над новой версией технологии. Работа над очередным релизом ASP началась с переименования проекта в ASP+.

ASP+ вышел более быстрым и масштабируемым, а также в нем исправили проблемы, связанные с безопасностью, управлением состояния и развертыванием.

Но главным нововведением в ASP+ стала поддержка языка C#, представленного компанией Microsoft в 2000 году. Более того, C# стал основным инструментом создания веб-приложений на платформе .NET.

В 2002 году ASP.NET выпустили вместе с платформой .NET Framework 1.0. Он предоставлял разработчикам мощный инструментарий, включая такие новые инструменты, как:

  • ASP.NET Web Forms;
  • ASP.NET MVC;
  • ASP.NET Web API.

ASP.NET стал популярным и востребованным среди веб-разработчиков, потому что был гибким. Он позволял создавать сложные веб-приложения, которые могли обрабатывать большие объемы данных и работать с разными внешними источниками, включая базы данных.

Развивая проект ASP.NET, в 2016 году Microsoft выпустила новую версию платформы под названием ASP.NET Core. Разработчики обеспечили более высокую производительность, меньший размер приложения, а также совместимость с разными операционными системами, включая Linux и macOS.

Одно из ключевых изменений в ASP.NET Core — переработка архитектуры и базовых концепций. Вместо использования Application Domain, ASP.NET Core использует пространства имен и сборки для организации и управления кодом приложения.

Кроме того, ASP.NET Core предоставляет интегрированную поддержку для создания микросервисных приложений и API. Это открывает разработчикам возможность проектирования масштабируемых приложений.

Этап № 9

Что же, теперь добавим метод для работы с DELETE-запросами. Этот метод станет вызываться каждый раз, когда мы будем пытаться удалить имеющееся значение из списка посредством DELETE-запроса:

[WebInvoke(Method = "DELETE", RequestFormat = WebMessageFormat.Ison,
    UriTemplate = "/Tutorial/{Tutorialid}", ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Wrapped)]

public void DeleteTutorial(String Tutorialid)
{
    int pid;
    Int32.TryParse(Tutorialid, out pid);
    1st.RemoveAt(pid);
}

Первая-вторая строки не имеют ничего особенного и, по сути, не отличаются от предыдущих методов, сигнализируя о том, что нижеуказанный метод станет вызываться при каждом DELETE-запросе.

Что касается метода DeleteTutorial(), то в нём мы приводим переданный TutorialId к типу Integer, удаляя из списка соответствующий элемент.

В результате код должен выглядеть так (без учёта элементов, бывших там изначально):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;

namespace Webservice.REST
{
    
    
    public class TutorialService
    {
        private static List<string> lst = new List<string>
        {
            "Arrays",
            "Queues",
            "Stacks"
        };

        [WebGet(UriTemplate = "/Tutorial")]

        public string GetAllTutorials() => String.Join(",", lst);

        [WebGet(UriTemplate = "/Tutorial/{TutorialId}")]

        public string GetTutorialByID(string TutorialId)
        {
            int pid;
            if (!TryParse(TutorialId, out pid)) {
                throw new HttpResponseException("TutorialId must be an integer", HttpStatusCode.BadRequest);
            }
            return lstpid];
        }

        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json,
            UriTemplate = "/Tutorial", ResponseFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.Wrapped)]

        public void AddTutorial(string str) => lst.Add(str);

        [WebInvoke(Method = "DELETE", RequestFormat = WebMessageFormat.Json,
            UriTemplate = "/Tutorial/{TutorialId}", ResponseFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.Wrapped)]

        public void DeleteTutorial(string TutorialId)
        {
            int pid;
            if (!TryParse(TutorialId, out pid)) {
                throw new HttpResponseException("TutorialId must be an integer", HttpStatusCode.BadRequest);
            }
            lst.RemoveAt(pid);
        }
    }
}

Вот и всё, RESTful веб-сервис на ASP.NET создан! Теперь нужно его запустить и протестировать. Но об этом поговорим в следующий раз.

Introduction

Creating your first web service is incredibly easy. In
fact, by using the wizards in Visual Studio. NET you can have your first service
up and running in minutes with no coding.

For this example I have created a service called in the /WebServices directory on my local machine. The files will be
created in the /WebServices/MyService directory.

A new namespace will be defined called , and within this namespace will be a set
of classes that define your Web Service. By default the following classes will be
created:

Global (in global.asax) Derived from HttpApplication. This file is the
ASP.NET equivalent of a standard ASP global.asa file.
WebService1 (in WebService1.cs) Derived from . This
is your WebService class that allows you to expose methods that can be
called as WebServices.

There are also a number of files created:

AssemblyInfo.cs Contains version and configuration information
for your assembly.
web.config Defines how your application will run (debug
options, the use of cookies etc).
MyService.disco Discovery information for your service.
WebService1.asmx Your WebService URL. Navigate to this file in a
browser and you will get back a user-friendly page showing the methods
available, the parameters required and the return values. Forms are even
provided allowing you to test the services through the web
page.
bin\MyService.dll The actual WebService component. This is created when you build the service.

The class for your service that is created by default is
called (in this case) , and is within the namespace. The code is
partially shown below.

C#

namespace MyService
{
    ...
                [WebService(Namespace="http://codeproject.com/webservices/",
	            Description="This is a demonstration WebService.")]
    public class WebService1 : System.Web.Services.WebService
    {
        public WebService1()
        {
            
            InitializeComponent();
        }

        ...
        
        
        public string HelloWorld()
        {
            return "Hello World";
        }
    }
}

A default method is generated and commented out. Simply
uncomment and build the project. Hey Presto, you have a walking talking
WebService. 

A WebService should be associated with a namespace. Your Wizard-generated
service will have the name space http://tempuri.org. If you compile and run the
service as-is you’ll get a long involved message indicating you should choose a
new namespace, so we add the namespace, and the WebService description as
follows:

C#

[WebService(Namespace="http://codeproject.com/webservices/",
            Description="This is a demonstration WebService.")]
public class WebService1 : System.Web.Services.WebService
{
    ...

To test the service you can right click on WebService1.asmx in the Solution Explorer in Visual Studio and
choose «View in Browser». The test page is shown below,

When invoked this returns the following:

Advanced concepts to learn next

Congratulations on completing your first .NET Core application! You’re off to a great start in your bright .NET career.

Some next concepts to learn along your journey are:

  • .NET apps debug techniques
  • Database seeding
  • Authentication
  • Custom SQL Queries
  • Validation
  • Tag Helpers
  • Middleware

To help get you up to speed quickly, Educative has created the course Developing Applications with ASP.NET Core. This course will walk you through each of these advanced concepts with hands-on code practice.

By the end, you’ll have the .NET skills you need to stand out in future interviews.

Happy learning!

Continue reading about software architectures

  • Microservices Architecture Tutorial: all you need to get started
  • How to Design a Web Application: Software Architecture 101
  • Top 5 technologies for building a Microservices Architecture

Что делают с помощью ASP.NET?

С помощью ASP.NET создают разные веб-приложения и сервисы, включая:

  • Веб-сайты. Простые и статические сайты, которые не требуют сложной логики и обработки данных.
  • Веб-приложения. Сложные приложения с высокой степенью логики и обработки данных, которые могут быть использованы для управления бизнес-процессами, продажей товаров или предоставления услуг.
  • Сервисы. Приложения, которые могут быть использованы для обмена данными между различными приложениями и системами.
  • API. С помощью ASP.NET можно создавать API для обмена данными с другими приложениями и службами.
  • Мобильные приложения. ASP.NET также может быть использован для создания мобильных приложений с использованием фреймворка Xamarin. Этот фреймворк позволяет разрабатывать кроссплатформенные нативные приложения для iOS и Android.

Как работает Xamarin

CGI программа для передачи данных в поле

Когда вам нужно выбрать несколько вариантов, мы используем галочки.

В следующем примере HTML-код формы с двумя флажками:

<form action="/cgi-bin/cpp_checkbox.cgi" 
         method="POST" 
         target="_blank">
<input type="checkbox" name="maths" value="on" /> 数学
<input type="checkbox" name="physics" value="on" /> 物理
<input type="submit" value="选择学科" />
</form>

Следующая программа C ++ будет генерировать cpp_checkbox.cgi скрипт для обработки веб-браузер, введя в поле заданной.

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
   bool maths_flag, physics_flag;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递复选框数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   maths_flag = formData.queryCheckbox("maths");
   if( maths_flag ) {  
      cout << "Maths Flag: ON " << endl;  
   }else{
      cout << "Maths Flag: OFF " << endl;  
   }
   cout << "<br/>\n";

   physics_flag = formData.queryCheckbox("physics");
   if( physics_flag ) {  
      cout << "Physics Flag: ON " << endl;  
   }else{
      cout << "Physics Flag: OFF " << endl;  
   }
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Основы сообщений HTTP

Возможно, вы ежедневно используете Интернет, но часто ли вы задумываетесь об основных принципах, обеспечивающих работоспособность глобальной сети? Мне не свойственно распространяться об архитектурных концепциях, но некоторые основные идеи, породившие глобальную сеть, могут оказаться совсем не очевидными с первого взгляда. По моему мнению, глубокое понимание этих принципов является необходимым первоначальным этапом создания служб на основе веб-протоколов. Не забывайте, что этой теме посвящены целые книги, поэтому в данной статье будут затронуты только главные моменты.

HTTP является транспортным средством глобальной сети. Протоколу HTTP требуется шаблон обмена сообщениями (MEP) для запроса и отклика. Каждый раз при использовании обозревателя для перехода на веб-страницу происходит следующее: запрашивается ресурс и возвращается один отклик, содержащий этот ресурс. Транспорт HTTP определяет несколько глаголов (называемых также методами), надстраивающих функции на шаблоне запроса или отклика MEP, например GET, POST, PUT и DELETE. Чтобы проиллюстрировать некоторые различия между глаголами HTTP, рассмотрим подробнее глагол POST протокола HTTP. Приведем укороченную версию:

POST /myservice/PostAlbum HTTP 1.1HOST: www.cloudsample.net<albumInfo>  <albumId>15</albumId></albumInfo>

По существу, это просто сообщение, отправляемое ожидающему вызова приложению. В данном случае сообщение отправляется по адресу http://www.cloudsamples.net/myservice/PostAlbum. В этом сообщении содержатся также полезные данные, в которые входит значение для поля albumId. Выделяя основное, можно сказать, что глагол POST протокола HTTP представляет собой способ передавать полезные данные приложению, ожидающему вызова.

В данном примере полезные данные настолько просты, что они целиком могли бы быть представлены числом 15. Чтобы эта схема работала, принимающее приложение должно знать, что число 15 соответствует значению поля albumId. Эта возможность наряду с другими является одной из основных, предлагаемых глаголом GET протокола HTTP. Например, преобразуя предыдущий HTTP POST в HTTP GET, мы получаем следующее:

GET /myservice/GetAlbum/15 HTTP 1.1HOST: www.cloudsamples.net

HTTP GET является оптимизированным HTTP POST и позволяет избавиться от необходимости использования полезной нагрузки. По существу, полезной нагрузкой является URI-адрес. Результатом этого является уменьшение размеров сообщений, что, в свою очередь, приводит к сокращению времени передачи. Уменьшение размеров сообщения и надежность URI-адреса обеспечивают еще одно положительное следствие: другим приложениям (прокси или обозревателям) проще кэшировать результаты предыдущих сообщений HTTP GET для одного и того же ресурса

Важно отметить, что HTTP GET используется чаще, чем любой другой глагол HTTP

По своей сути, HTTP GET является запросом некоторого ресурса. Чтобы проиллюстрировать это, представим, что вы ищете интересующий вас ресурс в Интернете (скажем, http://www.cloudsamples.net/pictureservices) и собираетесь сообщить о нем другу по электронной почте. Когда ваш друг получает сообщение электронной почты, предполагается, что он, щелкнув ссылку, увидит ту же страницу, которую просматривали вы. Понятно, что вы будете удивлены, если ресурс по адресу http://www.cloudsamples.net/pictureservices внезапно окажется страницей с последними новостями от MSNBC. На самом деле URI-адрес, используемый в HTTP GET, действительно является представлением ресурса, и вы, как правило, не предполагаете, что ресурс изменится.

В то время как имеется полное согласие относительно того, что представляет HTTP GET, это не так для других глаголов HTTP. Представим реализацию отправки сообщения HTTP DELETE принимающему приложению. Должно ли принимающее приложение изменить свое состояние или выполнить то же действие? Обычно глагол HTTP DELETE связан с субтрактивным изменением состояния или действием, но особенности этого изменения состояния не определяются. То же самое верно и для HTTP PUT. Глагол HTTP PUT, как правило, связан с некоторым типом аддитивного изменения состояния или действием, но точная форма этого изменения меняется от приложения к приложению.

CGI Environment Variables

All the CGI program will have access to the following environment variables. These variables play an important role while writing any CGI program.

Sr.No Variable Name & Description
1

CONTENT_TYPE

The data type of the content, used when the client is sending attached content to the server. For example file upload etc.

2

CONTENT_LENGTH

The length of the query information that is available only for POST requests.

3

HTTP_COOKIE

Returns the set cookies in the form of key & value pair.

4

HTTP_USER_AGENT

The User-Agent request-header field contains information about the user agent originating the request. It is a name of the web browser.

5

PATH_INFO

The path for the CGI script.

6

QUERY_STRING

The URL-encoded information that is sent with GET method request.

7

REMOTE_ADDR

The IP address of the remote host making the request. This can be useful for logging or for authentication purpose.

8

REMOTE_HOST

The fully qualified name of the host making the request. If this information is not available then REMOTE_ADDR can be used to get IR address.

9

REQUEST_METHOD

The method used to make the request. The most common methods are GET and POST.

10

SCRIPT_FILENAME

The full path to the CGI script.

11

SCRIPT_NAME

The name of the CGI script.

12

SERVER_NAME

The server’s hostname or IP Address.

13

SERVER_SOFTWARE

The name and version of the software the server is running.

Here is small CGI program to list out all the CGI variables.

#include <iostream>
#include <stdlib.h>
using namespace std;

const string ENV = {
   "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE",   
   "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING",             
   "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION",         
   "HTTP_HOST", "HTTP_USER_AGENT", "PATH",            
   "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT",      
   "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME",
   "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN",      
   "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL",     
   "SERVER_SIGNATURE","SERVER_SOFTWARE" };   

int main () {
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI Environment Variables</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";

   for ( int i = 0; i < 24; i++ ) {
      cout << "<tr><td>" << ENV << "</td><td>";
      
      // attempt to retrieve value of environment variable
      char *value = getenv( ENV.c_str() );  
      if ( value != 0 ) {
         cout << value;                                 
      } else {
         cout << "Environment variable does not exist.";
      }
      cout << "</td></tr>\n";
   }
   
   cout << "</table><\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

ASP.NET Web API

API — это прикладной программный интерфейс, указывающий, каким образом следует обращаться к программе и какие ответы она обязана предоставлять пользователям. Web API — способ построения ASP.NET-приложения, который подходит для применения совместно с REST архитектурой, предполагающей популярный подход к взаимодействию с сервером через HTTP-запросы GET, POST, PUT, DELETE.

Две рассмотренные выше технологии позволяют разрабатывать качественные веб-приложения для серверной стороны. Для их изучения рекомендуем видео курсы “ASP.NET API 2”, “ASP.NET MVC 5”, “ASP.NET MVC Fundamentals”. Хороший контент по ASP.NET Web API есть и на уже упомянутом сайте Metanit: “Полное руководство по ASP.NET MVC 5”, “Руководство по Web API”.

Модели разработки в ASP.NET

Модели разработки в ASP.NET определяют, как приложение будет организовано.

Существует много разных моделей разработки, которые могут использоваться в ASP.NET в зависимости от задачи, которую нужно решить.

Модели разработки в ASP.NET Core

Ниже рассмотрим основные:

Model-View-Controller

Одна из наиболее распространенных моделей разработки в ASP.NET.

Model-View-Controller (MVC) — это популярный шаблон проектирования, который разделяет приложение на три основных компонента: (1) модель, (2) представление и (3) контроллер:

  • модель содержит данные и логику приложения, которая управляет этими данными;
  • представление определяет, как данные будут отображаться на экране;
  • а контроллер управляет потоком данных между моделью и представлением.

MVC предназначена для разработки сложных веб-приложений с высокой степенью логики и обработки данных. Также модель часто выбирают для создания мобильных и одностраничных проектов. 

Web Forms

Также очень распространенная модель разработки в ASP.NET, но она используется в основном в старых проектах.

В Web Forms приложение разрабатывается в виде набора веб-страниц, каждая из которых содержит разметку HTML и код на языке C# или VB.NET.

Веб-страницы могут быть связаны между собой с помощью элементов управления, таких как кнопки или ссылки.

В целом существует тенденция отказа от Web Forms в пользу ASP.NET MVC, которая является более продвинутой и предоставляет лучшие возможности для тестирования и управления HTML-разметкой.

Web API

Web API позволяет создавать RESTful веб-сервисы, которые будут обрабатывать HTTP-запросы и возвращать HTTP-ответы. С помощью Web API можно выполнять форматирование ответов (в JSON, XML и других форматах), конфигурировать маршрутизацию запросов, назначать фильтры действий и многое другое.

С помощью инструмента Web API можно создавать всевозможные веб-сервисы, например, сервисы авторизации или сервисы по обработке платежей, сервисы управления содержимым и многое другое. Он также может быть использован для создания мобильных приложений и других клиентских приложений, которые получают данные из веб-сервисов.

Razor Pages

Появилась в последних версиях ASP.NET. Razor Pages обеспечивает простой и интуитивно понятный подход к созданию веб-страниц.

Она задействует упрощенный шаблон «модель-страница», где каждая страница имеет свою модель, которая содержит данные и логику страницы. Эта модель может быть связана с элементами на странице, такими как формы или кнопки:

Разница между MVC и Razor Page

Blazor

Модель разработки Blazor используется как при создании SPA
Single Page Applications-приложений (одностраничники), так для многостраничных продуктов.

В Blazor используется концепция компонентов, которые можно сравнить с пользовательскими элементами управления в других технологиях, таких как WPF и WinForms. Каждый компонент содержит свой логический код и пользовательский интерфейс.

Blazor поддерживает две реализации: (1) Blazor Server и (2) Blazor WebAssembly:

В Blazor Server приложение запускается на сервере, а пользовательский интерфейс отображается в браузере с помощью SignalR-технологии

SignalR — это библиотека, которая позволяет создавать приложения в режиме реального времени. SignalR может использоваться в разных моделях разработки ASP.NET, включая Web Forms, MVC, Web API и Blazor.. Это позволяет создавать динамические пользовательские интерфейсы, не загружая каждый раз новую страницу.

В Blazor WebAssembly приложение компилируется в WebAssembly и выполняется непосредственно в браузере. Это позволяет создавать SPA-приложения, которые могут работать в автономном режиме и не требуют постоянного подключения к серверу.

Why a new framework?

C++ is an extremely advanced and flexible language. Its performance is still unmatched by other languages, popular today – likes of Java and C# (for an interesting point of view on why many benchmarks, claiming that Java is faster than C++ are not applicable to the real world look here ). Even more important, it can be tightly integrated in most widespread web servers (Apache, IIS) to run in-process, and not as an external service, thus eliminating inter-process communication.

One of the main advantages of C++ is its tight management of resources, such as memory allocation. And indeed, although doing explicit memory handling properly can be a nightmare for an unexperienced developer, by using modern programming paradigms, it can be exploited to give a powerful and safe control over resource allocation and destruction. The predictable nature of C++ memory management, as opposed to concurrently run garbage collectors, is an important feature when squeezing every single flop from your CPU.

Also, using C++’s template system and rather sophisticated techniques, based on it, such as meta-programming, can help in creating sets of highly decoupled components, which can be assembled into complicated pieces of software easily.

Economics: isn’t hardware cheaper than development time?

This is the question, usually asked by project managers and those, who pay the bill. The idea is – take whatever solution is available already on the market, and if it is a little bit too slow, throw in a bigger iron or two and your bottom line will still be better than if you wrote the staff from ground up yourself.

This is a perfectly legal argument and it is actually applicable to many real projects. Hardware, especially Intel-compatible is quite inexpensive, so throwing in an extra G of RAM or a faster hard disk is usually a matter of few hundreds of dollars.

However, when we start talking about doubling performance of a very busy web site, with a lot of heavy activity, things could look a little bit different.

For example, imagine you are running an extremely successful advertising campaign. As an outcome, your current farm of 30 2U IBM xSeries servers does not provide you the performance you want anymore, and you think that it needs at least doubling. Therefore, in the end you will have 60 servers. Let’s ignore their acquisition cost for a minute (but it will be a hefty $60,000-$100,000 or more). What if you don’t have enough floor space in your data center to accommodate them? Will you have to move to a new one, increasing your rent bill, incurring the cost of removals and suffering service disruption? What about extra system administrators you might need to hire in order to support them? There are other components in your system, which might require upgrade, databases for instance.

The conclusion is that doubling a large computer farm is not as simple as buying two servers instead of one. Therefore, for large and business-critical application it makes sense to consider investing into performance, even if it means using less popular technologies.

Potential adopters

I have already stated, that not every single web application should be written in C++. My intention is to give a powerful and flexible framework to those entities, which need to run extremely busy sites and which are prepared to invest in development of such sites a little bit more, knowing that the result will be much more powerful and scalable than any other alternative.

I consider high profile web sites, such as popular portals (Yahoo!, MySpace, AOL), blogging communities (LiveJournal, Blogger), relationship building (LinkedIn, OpenBC), popular on-line shops and others, receiving millions of visits regularly and delivering dynamic content to the users.

Naturally, I don’t believe that all of them will ditch their current platforms and switch to the new toy of the month. But if a successful platform existed, over the time some of them would evaluate it and use it for some projects.

The following would be key factors, which could make a C++ web development framework attractive for potential users:

Highly dynamic site – large portions of the content cannot be cached effectively and need recreating on every view

Huge number of visits

Availability of necessary resources – developers, administrators and so on

Good project management procedures in place

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Written By

Chris Maunder

Founder
CodeProject

 Canada

Chris Maunder is the co-founder of CodeProject and ContentLab.com, and has been a prominent figure in the software development community for nearly 30 years. Hailing from Australia, Chris has a background in Mathematics, Astrophysics, Environmental Engineering and Defence Research. His programming endeavours span everything from FORTRAN on Super Computers, C++/MFC on Windows, through to to high-load .NET web applications and Python AI applications on everything from macOS to a Raspberry Pi. Chris is a full-stack developer who is as comfortable with SQL as he is with CSS.
In the late 1990s, he and his business partner David Cunningham recognized the need for a platform that would facilitate knowledge-sharing among developers, leading to the establishment of CodeProject.com in 1999. Chris’s expertise in programming and his passion for fostering a collaborative environment have played a pivotal role in the success of CodeProject.com. Over the years, the website has grown into a vibrant community where programmers worldwide can connect, exchange ideas, and find solutions to coding challenges. Chris is a prolific contributor to the developer community through his articles and tutorials, and his latest passion project, CodeProject.AI.
In addition to his work with CodeProject.com, Chris co-founded ContentLab and DeveloperMedia, two projects focussed on helping companies make their Software Projects a success. Chris’s roles included Product Development, Content Creation, Client Satisfaction and Systems Automation.

Simple URL Example: Get Method

Here is a simple URL which will pass two values to hello_get.py program using GET method.

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

Below is a program to generate cpp_get.cgi CGI program to handle input given by web browser. We are going to use C++ CGI library which makes it very easy to access passed information −

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>  

using namespace std;
using namespace cgicc;

int main () {
   Cgicc formData;
   
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Using GET and POST Methods</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("first_name");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "First name: " << **fi << endl;  
   } else {
      cout << "No text entered for first name" << endl;  
   }
   
   cout << "<br/>\n";
   fi = formData.getElement("last_name");  
   if( !fi->isEmpty() &&fi != (*formData).end()) {  
      cout << "Last name: " << **fi << endl;  
   } else {
      cout << "No text entered for last name" << endl;  
   }
   
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Now, compile the above program as follows −

$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc

Generate cpp_get.cgi and put it in your CGI directory and try to access using following link −

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

This would generate following result −

First name: ZARA 
Last name: ALI 

Среда разработки (IDE)

Средство разработки, которое включает в себя мощный редактор кода и набор инструментов для работы с проектом, его сборки и т.п. называется IDE. На данный момент существует несколько IDE, в которых есть все необходимое для того чтобы начать путь разработчика на C#, далее будут рассмотрены процессы установки Microsoft Visual Studio, VS Code, JetBrains Rider на ОС Windows.

Microsoft Visual Studio

Если ваша основная ОС это Windows, то одним из самых мощных и удобных средств для разработки приложений под эту платформу является Visual Studio. Это полнофункциональная среда позволяет разрабатывать все типы приложений под Windows, Android, iOS, Linux, веб-сервисы и облачные приложения, поддерживает как .NET Framework так и .NET Core. На момент написания статьи самая актуальная версия этого продукта – это Visual Studio 2019, она имеет ряд лицензий – Community, Professional, Enterprise. Для начинающего разработчика Community варианта будет более чем достаточно, эта лицензия позволяет разрабатывать даже коммерческое ПО, но у нее есть некоторые ограничения, более подробная информация по этому вопросу есть на официальном сайте Microsoft.

Сохраните файл установки на компьютере. Это веб-установщик, поэтому он имеет небольшой размер. Запустите его, в результате вам будет представлено окно приветствия.

Нажмите на кнопку “Продолжить” дождитесь окончания подготовительного этапа. После этого откроется окно с настройкой компонентов, для выполнения всех работ по курсу достаточно выбрать “Разработка классических приложений .NET”, “ASP.NET и Разработка веб-приложений”.

Дождитесь окончания установки, это может занять продолжительное время в зависимости от мощности вашего компьютера и скорости доступа в интернет.

Microsoft VS Code

Еще один продукт от Microsoft, он позиционируется как легковесный редактор кода, включает в себя отладчик, инструменты для работы с Git, подсветку синтаксиса, IntelliSense, средства для рефакторинга и многое другое. VS Code предоставляет большое количество настроек визуального оформления редактора. 

Для его установки перейдите по  ссылке https://code.visualstudio.com/?wt.mc_id=vscom_downloads.

Нажмите на кнопку “Download for Windows” и сохраните дистрибутив на свой компьютер. 

Запустите скачанный файл. Нажмите “Далее” в окне с лицензионным соглашением.

В следующем окне оставьте все галочки без изменений и нажмите “Далее”.

В последнем окне нажмите кнопку “Установить” и дождитесь окончания установки.

Установка завершена.

JetBrains Rider

Нажмите кнопку “Скачать”, дождитесь загрузки дистрибутива и запустите его.

Нажмите “Next” и выберите место установки. На следующем экране можно произвести дополнительные настройки ассоциации файлов или оставить все как есть, после этого нажмите кнопку “Next”, а затем “Install”. 

Дождитесь окончания установки.

Онлайн интерпретаторы

Если вы хотите быстро проверить работу вашего кода, то лучше всего для этого подойдет онлайн интерпретатор C#. Далее приведены несколько проектов, которые можно использовать для этой цели:

Passing Information Using POST Method

A generally more reliable method of passing information to a CGI program is the POST method. This packages the information in exactly the same way as GET methods, but instead of sending it as a text string after a ? in the URL it sends it as a separate message. This message comes into the CGI script in the form of the standard input.

The same cpp_get.cgi program will handle POST method as well. Let us take same example as above, which passes two values using HTML FORM and submit button but this time with POST method as follows −

<form action = "/cgi-bin/cpp_get.cgi" method = "post">
   First Name: <input type = "text" name = "first_name"><br />
   Last Name: <input type = "text" name = "last_name" />
 
   <input type = "submit" value = "Submit" />
</form>

Here is the actual output of the above form. You enter First and Last Name and
then click submit button to see the result.

Понравилась статья? Поделиться с друзьями: