Интересные программы: обзор популярных ресурсов для развлечений

Configuring Project Properties:

The latest version of CEF requires .NET Framework 4.5.2, else you will get errors while debugging. Your project must be set to .NET Framework 4.5.2 or higher. To do so, go to Project > Web Browser Properties and set Target Framework to .NET Framework 4.5.2. If you do not have .NET Framework 4.5.2 on your list, then you have to install .NET Framework Multi-Targeting Pack manually from the Microsoft site.
Note: Also, Any CPU build is capable of newer versions in CEF. But, we shall later set it programmatically. For now, change your Platform Target according to your computer x86 or x64. And, do the same for Debug > Platform.

Переменные окружения CGI

Все программы CGI могут получить доступ следующие переменные окружения. Эти переменные при написании программ CGI играют очень важную роль.

变量名 描述
CONTENT_TYPE 内容的数据类型。当客户端向服务器发送附加内容时使用。例如,文件上传等功能。
CONTENT_LENGTH 查询的信息长度。只对 POST 请求可用。
HTTP_COOKIE 以键 & 值对的形式返回设置的 cookies。
HTTP_USER_AGENT 用户代理请求标头字段,递交用户发起请求的有关信息,包含了浏览器的名称、版本和其他平台性的附加信息。
PATH_INFO CGI 脚本的路径。
QUERY_STRING 通过 GET 方法发送请求时的 URL 编码信息,包含 URL 中问号后面的参数。
REMOTE_ADDR 发出请求的远程主机的 IP 地址。这在日志记录和认证时是非常有用的。
REMOTE_HOST 发出请求的主机的完全限定名称。如果此信息不可用,则可以用 REMOTE_ADDR 来获取 IP 地址。
REQUEST_METHOD 用于发出请求的方法。最常见的方法是 GET 和 POST。
SCRIPT_FILENAME CGI 脚本的完整路径。
SCRIPT_NAME CGI 脚本的名称。
SERVER_NAME 服务器的主机名或 IP 地址。
SERVER_SOFTWARE 服务器上运行的软件的名称和版本。

Ниже приведен список всех программах CGI CGI переменные.

#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 环境变量</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>";
       // 尝试检索环境变量的值
       char *value = getenv( ENV.c_str() );  
       if ( value != 0 ){
         cout << value;                                 
       }else{
         cout << "环境变量不存在。";
       }
       cout << "</td></tr>\n";
   }
   cout << "</table><\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Простые примеры URL: Получ

Вот простой URL, используя метод GET для передачи двух значений hello_get.py программы.

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

Следующие примеры генерируютcpp_get.cgi программу CGIдля обработки входного потока данную веб — браузером. С помощью библиотеки C ++ 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;
   
   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>使用 GET 和 POST 方法</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("first_name");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "名:" << **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 << "姓:" << **fi << endl;  
   }else{
      cout << "No text entered for last name" << endl;  
   }
   cout << "<br/>\n";

   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Теперь, компилировать эту программу следующим образом:

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

Сформировать cpp_get.cgi, и поместить его в каталог CGI и попытаться получить доступ к следующей ссылке:

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

Это дает следующие результаты:

名:ZARA 
姓:ALI 

Этап № 3

Теперь нам надо создать файл будущего RESTful веб-сервиса. Для этого кликаем правой кнопкой по файлу проекта Webservice.REST (также можно нажать Ctrl+Shift+A) и выбираем опции Add->new item:

Откроется окно, где находим опцию «WCF Service (с поддержкой технологии AJAX)» и даём ей имя TutorialSevice.svc. После выбора этой опции Visual Studio создаст код, который станет основой для реализации web-сервиса. В нашем случае WCF (Windows Communication Foundation) — это библиотека, используемая для налаживания взаимодействия между приложениями посредством разных протоколов типа TCP, HTTP и HTTPS. Что касается AJAX, то эта технология позволяет асинхронно обновлять web-страницы и обмениваться небольшими объёмами данных с сервером.

Установка .NET

.NET Framework

.NET Framework используется в Windows и входит в состав ОС начиная с Windows 7, более ранние версии .NET Framework необходимо было самостоятельно устанавливать перед началом разработки. На текущий момент самая новая версия: .NET Framework 4.8. Для того чтобы начать разработку под эту платформу необходимо установить среду Microsoft Visual Studio, о том, как это сделать читайте далее.

.NET Core

Выберите в таблице – .NET Core 3.1

В следующем окне вы увидите разные релизы платформы, нас интересует самый верхний. В строке нужного релиза найдите раздел Build apps – SDK.

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

Установка для Windows

Выберете дистрибутив под Windows и дождидесь его скачивания. После запуска файла установки, на первом экране вы увидите краткую информацию о продукте. Нажмите на кнопку “Установить”.

Начнется установка компонентов платформы .NET Core. Если все пройдет успешно, то в конце этого процесса будет представлен отчет об установке.

На этом процесс установки для Windows можно считать завершенным.

Установка .NET на Linux

Перейдите на страницу официальной документации Microsoft по установке .NET Core и убедитесь, что ваша операционная система (тип и версия) поддерживает возможность установки .NET Core. 

Далее рассмотрим пример для Ubuntu. Перейдите в соответствующий раздел документации, нас интересует .

Согласно приведенной инструкции нужно выполнить несколько шагов. Добавьте ключ подписывания пакета Microsoft в список доверенных ключей и добавьте репозиторий пакетов:

> wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb

> sudo dpkg -i packages-microsoft-prod.deb

После этого запустите установку SDK:

> sudo apt-get update; \
sudo apt-get install -y apt-transport-https && \
sudo apt-get update && \
sudo apt-get install -y dotnet-sdk-3.1

Для проверки того, что .NET Core установлен на вашей Linux машине можете проверить версии пакета SDK:

> dotnet --list-sdks
3.1.202 [/usr/share/dotnet/sdk]

И проверить версии среды выполнения:

> dotnet --list-runtimes
Microsoft.AspNetCore.App 3.1.4 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 3.1.4 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

What are C# Programming Distinctive Characteristics?

C# is a general-purpose language that uses static typing, component-oriented structure, and employs multiple paradigms. There are many ways to accomplish a given task with C#  – this is what makes the language suitable for complex projects. Static typing helps contain clear standards throughout the entire codebase and write consistently. 

What is C Sharp?

  • It’s a simple, general-purpose, and object-oriented language. 
  • The language stems from clear standards, strong typing, control of variables, and thorough garbage collecting. 
  • The language can be ported to many tech stack and devices. Developers who are already familiar with C and C++ can migrate within environments incredibly easily. 
  • C# is focused on preserving memory and minimizing power requirements. It’s intended to support large systems that accomplish multiple tasks simultaneously. 

Perhaps, the structural principles of C# can be described best with the word “productivity.” The language has the resources to build complex systems that run multiple tasking operations simultaneously. It works across multiple platforms – web, desktop, mobile development, you name it. 

Is C# easy to learn?

As any strong-typing language, C# has its own advantages and disadvantages, many of which are granted exactly by its rigid syntax. In static typing, making a mistake leads to an inability to run the entire codebase – so beginning developers can face difficulties. However, once you get used to C#’s typing, it becomes much more manageable. 

In the long run, C# is one of the easiest languages. Because there aren’t as many approaches, developers can easily understand each other’s code, garbage collectors track even small errors, and tech debt doesn’t accumulate. So, although the beginning stages might be rough, immediate learners eventually get to the pay-off. 

?

Read more about the most common software development strategies and take a look at their benefits and drawbacks.

Benefits of Including C# in the Tech Stack

C# can be used for many projects, but obviously, you might have another question – how to know when it’s the best option for the project? For each type of problem, there are several other languages that could also fill the bill. So, should you pick C#? What are the reasons to learn C# programming or base your product on it? 

  • Desktop applications for Windows. If you are building Windows-based software, C# is a go-to tool. The language is adapted to the requirements of the ecosystem, is supported by all environments, plugins, and libraries. If Microsoft Windows and the majority of other Windows tools are built with C#, it’s just more of a reason to consider it for your project as well. 
  • Highly-performing projects. C# is one of the fastest languages out there, but it’s not just that. C# can perform complex computational operations and process many requests simultaneously. Its syntax gives you instruments to solve very complex challenges and then execute the solutions.
  • Cross-platform compatibility. C#, under different conditions, can run on the desktop, mobile, and web. It supports complex interfaces and integrating APIs. 
  • Enterprise development. Enterprise platforms rely on cross-platform availability and reliable performance. C# has both – it’s productive, accessible, and fast. 
  • Large-teams projects: when multiple developers handle the same codebase, you need rigorous standards. C#, with its static typing and powerful garbage collector, provides just that. That’s also why beginners often have doubts along the lines of “is C# hard to learn?” At first, an exact syntax order might seem overwhelming, but in practice, it’s an excellent solution for avoiding tech debt. 

C# has a great ecosystem that makes it suitable for many projects and platforms. In our experience, this is what makes C# one of the most scalable tools for enterprise development. At first, this might seem like an insignificant advantage – however, when you are building enterprise software, requirements are constantly changing. So, you need a tech stack that accommodates these shifts and allows you to adapt. 

C#, with its ecosystem and cross-platform support, responds to these challenges incredibly well. Also, problems like high entry barriers become less relevant on the enterprise level since large teams usually have more resources. On top of that, with multiple learning resources (many of which are free), integrating C# is not that much of a challenge. 

C# can be a great language both for quick fixes and large solutions. If the team knows how to use multiple possibilities offered by the syntax and ecosystem, the business will have a much easier time scaling. 

Настройка веб-сервера

Перед тем, как сделать программирование CGI, убедитесь, что ваш веб-сервер поддерживает CGI, и был настроен для обработки программ CGI. Все программы CGI выполняются сервером HTTP, должен быть предварительно настроен каталог. Этот каталог называется каталог CGI, по соглашению с именем / Var / WWW / CGI-BIN. Хотя CGI исполняемый файл C ++, но по соглашению, это расширение.cgi.

По умолчанию веб-сервер Apache будет настроен для запуска в / Var / WWW / CGI-BIN в программе CGI. Если вы хотите указать другой каталог для запуска CGI скриптов, вы можете изменить следующий раздел в файле httpd.conf:

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all
</Directory>
 
<Directory "/var/www/cgi-bin">
Options All
</Directory>

Здесь мы предполагаем, у вас уже есть веб-сервер и может работать успешно, вы можете запускать любые CGI программы, такие как Perl или Shell и тому подобное.

File Upload Example

To upload a file the HTML form must have the enctype attribute set to multipart/form-data. The input tag with the file type will create a «Browse» button.

<html>
   <body>
      <form enctype = "multipart/form-data" action = "/cgi-bin/cpp_uploadfile.cgi"
         method = "post">
         <p>File: <input type = "file" name = "userfile" /></p>
         <p><input type = "submit" value = "Upload" /></p>
      </form>
   </body>
</html>

The result of this code is the following form −

Note − Above example has been disabled intentionally to stop people uploading files on our server. But you can try above code with your server.

Here is the script cpp_uploadfile.cpp to handle file upload −

#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 cgi;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>File Upload in CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   // get list of files to be uploaded
   const_file_iterator file = cgi.getFile("userfile");
   if(file != cgi.getFiles().end()) {
      // send data type at cout.
      cout << HTTPContentHeader(file->getDataType());
      // write content at cout.
      file->writeToStream(cout);
   }
   cout << "<File uploaded successfully>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

The above example is for writing content at cout stream but you can open your file stream and save the content of uploaded file in a file at desired location.

Hope you have enjoyed this tutorial. If yes, please send us your feedback.

Что такое ASP.NET

Платформа разрабатывалась как альтернатива другому популярному инструменту веб-разработки под названием Java. Изначально опытные версии Microsoft ASP.NET (тогда они еще назывались XSP) были написаны именно на языке Java, однако у компании лицензия на использование этого языка в своих продуктах истекала в 2003 году. С учетом этой перспективы разработчики компании решили создать платформу с собственной общеязыковой средой исполнения Common Language Runtime. Она позволила разрабатывать веб-приложения на любом языке, поддерживаемом технологией .NET, — а это большинство современных языков программирования. 

Использование общеязыковой среды исполнения означает, что код, написанный веб-программистом на любом языке программирования, работает в два этапа:

  • сначала компилируется в промежуточный язык Microsoft Intermediate Language — то есть независимо от того, на каком языке изначально была написана веб-страница, она превращалась в унифицированный документ;
  • затем полученная сборка на IL компилируется в низкоуровневый машинный код, который и исполняется в режиме just-in-time, то есть непосредственно перед запуском приложения.

Перед компиляцией в низкоуровневый машинный код компилятор определяет тип операционной системы и ее разрядность. Благодаря этому программисты могут создавать единый код на высокоуровневом языке для всех распространенных платформ. 

Созданные в платформе ASP.NET приложения компилируются в IL только один раз, повторная компиляция осуществляется только в том случае, если в исходный код были внесены изменения. А машинный код кэшируется в системном каталоге. При этом, если приложение создается в Visual Studio, его код переписывается в IL в рамках общей компиляции проекта. Однако код веб-сайта, созданный вне какого-либо проекта, компилируется постранично при первом запросе конкретной страницы. В любом случае преобразование IL-кода приложения в машинный происходит при первом же выполнении.

В ASP.NET реализована модель объектно-ориентированного программирования. Благодаря этому она дает разработчику доступ ко всем объектам в .NET Framework. Также данная модель обеспечивает:

  • создание повторно применяемых классов, которые упрощают и ускоряют написание кода;
  • стандартизацию кода с использованием интерфейсов;
  • расширение существующих классов путем наследования;
  • объединение полезных функций в скомпилированный компонент, который можно распространять отдельно.

Другая возможность, обусловленная объектно-ориентированной моделью программирования, заключается в серверных элементах управления. Они представляют собой инкапсулированные объекты, которыми разработчики могут манипулировать с помощью кода для настройки их облика, предоставления данных и реакции на события. HTML-разметка низкого уровня, визуализируемая этими компонентами управления, скрыта. Благодаря этому разработчики могут не писать ее самостоятельно — вместо этого инкапсулированные объекты самостоятельно переписываются в соответствующие HTML-элементы после того, как веб-страница будет визуализирована.

Курс для новичков «IT-специалист с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить

Подробнее

Passing Drop down Box Data to CGI Program

Drop down Box is used when we have many options available but only one or two will be selected.

Here is example HTML code for a form with one drop down box −

<form action = "/cgi-bin/cpp_dropdown.cgi" method = "post" target = "_blank">
   <select name = "dropdown">
      <option value = "Maths" selected>Maths</option>
      <option value = "Physics">Physics</option>
   </select>
   
   <input type = "submit" value = "Submit"/>
</form>

The result of this code is the following form −

Below is C++ program, which will generate cpp_dropdown.cgi script to handle input given by web browser through drop down box.

#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>Drop Down Box Data to CGI</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("dropdown");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Value Selected: " << **fi << endl;  
   }
  
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";
   
   return 0;
}

Шаблон проектирования начало/конец

Чтобы создать посредник в .NET 1.1, воспользуйтесь командой Добавить веб-ссылку в VS 2003, укажите URL для виртуального пути, например: http://localhost:1111/callwsasync/, и выберите Service.asmx. Посредник содержит BeginGetStock() и EndGetStock(). Назовите его WsClient1.WsTestRef1.Service и определите объект типа _wsProxy1. Листинг-2 ниже показывает, как работает первый клиент:

// Листинг-2. Использование шаблона начало/конец с обратным вызовомprivate void buttonGetQuote_Click(object sender, System.EventArgs e){    textBoxResult.Text = "";    _tmStart = DateTime.Now.Ticks;    string symbol = comboBoxSymb.Text.ToUpper();    int timeout = int.Parse(textBoxTimeout.Text);    _wsProxy1 = new WsClient1.WsTestRef1.Service();    _wsProxy1.BeginGetStock(symbol, timeout,             new AsyncCallback(OnGetStock), symbol);    }private void OnGetStock(IAsyncResult ar){    string symbol = (string)ar.AsyncState;    string result;        try     {        double value = _wsProxy1.EndGetStock(ar);        if (value ==0)            result = "Invalid, " + "'" +symbol +"'";        else        if (value <0)            result = "TimeOut, " + "";        else            result = "OK, " + value.ToString("F");    }    catch (WebException e)    {        if (e.Status == WebExceptionStatus.RequestCanceled)            result = "Cancelled, " + "<" +symbol +">";        else            result = "Exception, " + e.Message;    }    catch (Exception e)    {        result = "Exception, " + e.Message;    }     textBoxResult.Invoke(new ShowResultDelegate(ShowResult),                                       new object[] {result});    _wsProxy1 = null;}    private void buttonCancel_Click(object sender, System.EventArgs e){    if (_wsProxy1 != null)        _wsProxy1.Abort();}private delegate void ShowResultDelegate(string str);private void ShowResult(string str){    textBoxResult.Text = str + ",  (" +       (DateTime.Now.Ticks - _tmStart) / 10000 + " ms)";}

В buttonGetQuote_Click() получаются символ и время простоя из диалогового окна и передаются в _wsProxy1.BeginGetStock(), чтобы запустить асинхронный запрос. Третий параметр BeginGetStock() инициализирует обратный вызов OnGetStock(). Передается последний параметр AsyncState и символ, чтобы вернуть позже в обратном вызове как индикатор. Как только BeginGetStock() вызван, можно отменить запрос, вызвав _wsProxy1.Abort() в buttonCancel_Click().

Посмотрите на OnGetStock(). В блоке try сначала вызывается EndGetStock() для возврата результата. Помните, ноль означает нераспознанный символ, отрицательное значение для времени простоя, а остальные считаются нормальной котировкой.

Заметьте, что отмена ловится в WebException. Если вызывается Abort() посредника, запрос прерывается с веб-исключением. Обратный вызов все же вызывается, и WebException генерируется из EndGetStock(). Оно обнаруживается путем проверки состояния RequestCanceled, чтобы отличить другие веб-исключения, такие как сервер/сеть не работает.

Асинхронный обратный вызов выполняется в другом потоке, неявно управляемом пулом потоков .NET. Обратный вызов может не быть в контексте потока, вызывающего BeginGetStock(). Будьте сознательны, когда пытаетесь отправить команды управляющему элементу формы или обратиться к объекту-экземпляру, определенному в классе. Для этого вызывается textBoxResult.Invoke() вместо установки textBoxResult.Text напрямую.\

Usage

This program has been written and tested on Redhat Linux 6.0.
It should port without modification to other UNIX systems (with
the possible exception of the makefile), but will not generally
work on other platforms.

To keep things simple, the feature list of this server is
fairly restricted. For example:

  • There are no configuration files; all options are
    hard-coded
  • The server can only return HTML documents (actually
    the server will return any file, but the HTTP response
    will specify the content-length as «text/html»
  • There is no support for CGI or SSI
  • No log files are produced.
  • Importantly, with the exception of basic C error
    checking, there are no security measures
    included whatsoever! This program was written
    for basic instructional and demonstration purposes. Do
    not run it on any machine connected
    to an external network.

Тестовая веб-служба

Так как веб-служба общая для платформы, веб-службу можно использовать независимо от ее происхождения или версии. Была создана тестовая служба в .NET 2.0, используемая обоими клиентами. Service.cs в следующем листинге-1 представляет службу с единственным методом GetStock(), принимающим символ и возвращающим его котировку.

// Листинг-1. Тестовая веб-служба в Service.csusing System;using System.Web.Services;using System.Threading;[WebService(Namespace = "http://tempuri.org/")]public class Service : System.Web.Services.WebService{    Random  _delayRandom  = new Random();    Random  _stockRandom = new Random();        public double GetStock(string symbol, int timeout)     {        int delay = _delayRandom.Next(50, 5000);        Thread.Sleep(delay > timeout ? timeout : delay);        if (delay > timeout) return -1;        double value;        switch (symbol)        {            case "MSFT": value = 27;  break;            case "ELNK": value = 11;  break;            case "GOOG": value = 350; break;            case "SUNW": value = 6;   break;            case "IBM":  value = 81;  break;            default: value = 0; break;        }        return value + value * 0.1 * _stockRandom.NextDouble();    }}

Используются два объекта Random для моделирования действия службы. _delayRandom имитирует трафик по сети с 50 до 5000 миллисекунд, а _stockRandom предназначен для колебаний значения котировки. Служба позволяет клиенту установить timeout, второй параметр GetStock(). Поэтому, помимо возврата нормальной котировки, GetStock() также возвращает ноль для нераспознанного символа и минус один в качестве флага простоя.

Для простоты служба размещена на тестовом сервере VS 2005, как показано ниже:

 Чтобы сделать это самостоятельно, вызовите WebDev.WebServer.exe с опцией для физического пути, где Service.asmx располагается так (смотрите startWsTest.bat в демо):

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\WebDev.WebServer.EXE/port:1111/path:"c:\Articles\CallWsAsync\code\WebService2"/vpath:"/callwsasync"

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

 

Как видно, первый — статус OK с возвращенной котировкой. Второй – произошло исключение, если сервер/сеть недоступна. Третий – для неверного символа. Четвертый возникает при щелчке по кнопке Отменить сразу, чтобы прервать запрос. Последний – ответ сервера на время простоя, определенное в пользовательском интерфейсе. В каждом сценарии время сессии регистрируется на экране. Данный снимок экрана показывает пользовательский интерфейс первого клиента, и оба клиента реализованы одинаково.

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