Веб-сервисы в теории и на практике для начинающих
Время на прочтение
9 мин
Количество просмотров 577K
Что такое веб-сервисы?
Прежде всего, веб-сервисы (или веб-службы) — это технология. И как и любая другая технология, они имеют довольно четко очерченную среду применения.
Если посмотреть на веб-сервисы в разрезе стека сетевых протококолов, мы увидим, что это, в классическом случае, не что иное, как еще одна надстройка поверх протокола HTTP.
С другой стороны, если гипотетически разделить Интернет на несколько слоев, мы сможем выделить, как минимум, два концептуальных типа приложений — вычислительные узлы, которые реализуют нетривиальные функции и прикладные веб-ресурсы. При этом вторые, зачастую заинтересованы в услугах первых.
Но и сам Интернет — разнороден, т. е. различные приложения на различных узлах сети функционируют на разных аппаратно-программных платформах, и используют различные технологии и языки.
Чтобы связать все это и предоставить возможность одним приложениям обмениваться данными с другими, и были придуманы веб-сервисы.
По сути, веб-сервисы — это реализация абсолютно четких интерфейсов обмена данными между различными приложениями, которые написаны не только на разных языках, но и распределены на разных узлах сети.
Именно с появлением веб-сервисов развилась идея SOA — сервис-ориентированной архитектуры веб-приложений (Service Oriented Architecture).
Протоколы веб-сервисов
На сегодняшний день наибольшее распространение получили следующие протоколы реализации веб-сервисов:
- SOAP (Simple Object Access Protocol) — по сути это тройка стандартов SOAP/WSDL/UDDI
- REST (Representational State Transfer)
- XML-RPC (XML Remote Procedure Call)
На самом деле, SOAP произошел от XML-RPC и является следующей ступенью его развития. В то время как REST — это концепция, в основе которой лежит скорее архитектурный стиль, нежели новая технология, основанный на теории манипуляции объектами CRUD (Create Read Update Delete) в контексте концепций WWW.
Безусловно, существуют и иные протоколы, но, поскольку они не получили широкого распространения, мы остановимся в этом кратком обзоре на двух основных — SOAP и REST. XML-RPC ввиду того, что является несколько «устаревшим», мы рассматривать подробно не будем.
Нас в первую очередь интересуют вопросы создания новых веб-служб, а не реализация клиентов к существующим (как правило поставщики веб-сервисов поставляют пакеты с функциями API и документацией, посему вопрос построения клиентов к существующим веб-службам менее интересен с точки зрения автора).
SOAP против REST
Проблемы данного противостояния хорошо описаны в статье Леонида Черняка, найденой на портале www.citforum.ru.
По мнению же автора, кратко можно выделить следующее:
SOAP более применим в сложных архитектурах, где взаимодействие с объектами выходит за рамки теории CRUD, а вот в тех приложениях, которые не покидают рамки данной теории, вполне применимым может оказаться именно REST ввиду своей простоты и прозрачности. Действительно, если любым объектам вашего сервиса не нужны более сложные взаимоотношения, кроме: «Создать», «Прочитать», «Изменить», «Удалить» (как правило — в 99% случаев этого достаточно), возможно, именно REST станет правильным выбором. Кроме того, REST по сравнению с SOAP, может оказаться и более производительным, так как не требует затрат на разбор сложных XML команд на сервере (выполняются обычные HTTP запросы — PUT, GET, POST, DELETE). Хотя SOAP, в свою очередь, более надежен и безопасен.
В любом случае вам решать, что больше подойдет вашему приложению. Вполне вероятно, вы даже захотите реализовать оба протокола, чтобы оставить выбор за пользователями службы и — это ваше право.
Практическое применение веб-сервисов
Поскольку речь идет о практическом применении, нам нужно выбрать платформу для построения веб-службы и поставить задачу. Так как автору ближе всего PHP 5, мы и выберем его в качестве технологии для построения службы, а в качестве задачи примем следующие требования.
Допустим, нам необходимо создать службу, предоставляющую доступ к информации о курсах валют, которая собирается нашим приложением, и накапливается в базе данных. Далее посредством веб-сервиса, данная информация передается сторонним приложениям для отображения в удобном для них виде.
Как видим задача довольно проста и, с точки зрения самой службы, ограничивается лишь чтением информации, но в практических целях нам этого будет достаточно.
Этап первый — реализация приложения сбора информации о курсах валют.
Информацию о курсах валют мы будем собирать со страниц сайта НБУ (Национального Банка Украины) ежедневно и складывать в базу данных под управлением СУБД MySQL.
Создадим структуру данных.
Таблица валют (currency):
+-------------+------------------+ | Field | Type | +-------------+------------------+ | code | int(10) unsigned | | charcode | char(3) | | description | varchar(100) | | value | int(10) unsigned | | base | tinyint(1) | +-------------+------------------+
Таблица номиналов обмена (exchange):
+------------+------------------+ | Field | Type | +------------+------------------+ | id | bigint(20) ai | | rate_date | timestamp | | rate_value | float | | code | int(10) unsigned | +------------+------------------+
Для работы с базой данных воспользуемся ORM слоем на базе пакета PHP Doctrine. Реализуем граббер:
класс Grubber (models/Grabber.php):
<?php /* * @package Currency_Service */ class Grabber { /** * Extracts data from outer web resource and returns it * * @param void * @return array */ public static function getData() { /** * Extracting data drom outer web-resource */ $content = file_get_contents( 'http://www.bank.gov.ua/Fin_ryn/OF_KURS/Currency/FindByDate.aspx'); if(preg_match_all( '/(d+)</td>([A-Z]+)</td>(d+)</td>(.+?)</td>(d+.d+)</td>/i', $content, $m) == false) { throw new Exception( 'Can not parse data!'); } /** * Preformatting data to return; */ $data = array(); foreach ($m[1] as $k => $code) { $data[] = array( 'code' => $code, 'charcode' => $m[2][$k], 'value' => $m[3][$k], 'description' => $m[4][$k], 'rate_value' => $m[5][$k] ); } return $data; } public static function run() { $data = self::getData(); /** * Sets default currency if not exists */ if (!Doctrine::getTable( 'Currency')->find( 980)) { $currency = new Currency(); $currency->setCode( 980) ->setCharcode( 'UAH') ->setDescription( 'українська гривня') ->setValue( 1) ->setBase( 1) ->save(); } foreach ($data as $currencyData) { /** * Updating table of currencies with found values */ if (!Doctrine::getTable( 'Currency')->find( $currencyData['code'])) { $currency = new Currency(); $currency->setCode( $currencyData['code']) ->setCharcode( $currencyData['charcode']) ->setDescription( $currencyData['description']) ->setValue( $currencyData['value']) ->setBase( 0) ->save(); } /** * Updating exchange rates */ $date = date( 'Y-m-d 00:00:00'); $exchange = new Exchange(); $exchange->setRateDate( $date) ->setRateValue( $currencyData['rate_value']) ->setCode( $currencyData['code']) ->save(); } } } ?>
и сам граббер (grabber.php):
<?php require_once('config.php'); Doctrine::loadModels('models'); Grabber::run(); ?>
Теперь заставим наш граббер отрабатывать раз в сутки в 10:00 утра, путем добавления команды запуска граббера в таблицы cron:
0 10 * * * /usr/bin/php /path/to/grabber.php
Все — у нас есть достаточно полезный сервис.
Теперь реализуем веб-сервис, который позволит другим приложениям извлекать данные из нашей базы.
Реализация SOAP сервиса
Для реализации веб-сервиса на базе SOAP протокола, мы воспользуемся встроенным пакетом в PHP для работы с SOAP.
Поскольку наш веб-сервис будет публичным, хорошим вариантом будет создание WSDL файла, который описывает структуру нашего веб-сервиса.
WSDL (Web Service Definition Language) — представляет из себя XML файл определенного формата. Подробное описание синтаксиса можно найти здесь.
На практике будет удобно воспользоваться функцией автоматической генерации файла, которую предоставляет IDE Zend Studio for Eclipse. Данная функция позволяет генерировать WSDL файл из классов PHP. Поэтому, прежде всего, мы должны написать класс, реализующий функциональность нашего сервиса.
класс CurrencyExchange (models/CurrencyExchange.php):
<?php /** * Class providing web-service with all necessary methods * to provide information about currency exchange values * * @package Currency_Service */ class CurrencyExchange { /** * Retrievs exchange value for a given currency * * @param integer $code - currency code * @param string $data - currency exchange rate date * @return float - rate value */ public function getExchange( $code, $date) { $currency = Doctrine::getTable( 'Currency')->find( $code); $exchange = $currency->getExchange( $date); return $exchange ? (float)$exchange->getRateValue() : null; } /** * Retrievs all available currencies * * @return array - list of all available currencies */ public function getCurrencyList() { return Doctrine::getTable( 'Currency')->findAll()->toArray(); } } ?>
Отметим, что для автоматической генерации WSDL, нам необходимо написать комментарии в стиле javadoc, потому что именно в них мы прописываем информацию о типах принимаемых аргументов и возвращаемых значений. Неплохо также описывать в нескольких словах работу методов — ведь WSDL послужит описанием API для сторонних разработчиков, которые будут использовать ваш веб-сервис.
Не пишите в докблоках param void или return void — для WSDL это не критично, но вот при реализации REST доступа к тому-же классу у вас возникнут проблемы.
Теперь в Zend Studio входим в меню File->Export…, выбираем PHP->WSDL, добавляем наш класс, прописываем URI-адрес нашего сервиса и создаем WSDL-файл. Результат должен быть примерно таким: http://mikhailstadnik.com/ctws/currency.wsdl
Если вы будете добавлять новую функциональность в ваш веб-сервис, вам нужно будет пересоздавать WSDL-файл. Но здесь не так все гладко. Следует учитывать, что SOAP-клиент, который уже запрашивал ваш WSDL файл, кеширует его на своей стороне. Поэтому, если вы замените старое содержимое новым в WSDL файле, некторые клиенты его не прочтут. А значит, при добавлении новой функциональности, дописывайте версию в имя вашего файла. И не забудбте обеспечить обратную совместимость для старых клиентов, особенно если вы не являетесь их поставщиком.
С другой стороны, WSDL довольно жестко задает структуру веб-сервиса, а это значит, что, если существует необходимость ограничить функциональность клиента по сравнению с сервером, вы можете не включать определенные методы ваших классов в WSDL. Таким образом они не смогут быть вызваны, несмотря на то, что существуют.
Реализация же самого сервера не предстваляет теперь никакой сложности:
файл index.php:
<?php require_once('config.php'); Doctrine::loadModels('models'); $server = new SoapServer( 'http://mikhailstadnik.com/ctws/currency.wsdl'); $server->setClass( 'CurrencyExchange'); $server->handle(); ?>
Вы можете попробовать веб-сервис в работе по адресу: http://mikhailstadnik.com/ctws/
Там же доступен тестовый клиент: http://mikhailstadnik.com/ctws/client.php
Код простейшего клиента может быть таким:
<?php $client = new SoapClient( 'http://mikhailstadnik.com/ctws/currency.wsdl'); echo 'USD exchange: ' . $client->getExchange( 840, date( 'Y-m-d')); ?>
Реализация REST сервиса
REST — это не стандарт и не спецификация, а архитектурный стиль, выстроенный на существующих, хорошо известных и контролируемых консорциумом W3C стандартах, таких, как HTTP, URI (Uniform Resource Identifier), XML и RDF (Resource Description Format). В REST-сервисах акцент сделан на доступ к ресурсам, а не на исполнение удаленных сервисов; в этом их кардинальное отличие от SOAP-сервисов.
И все же удаленный вызов процедур применим и в REST. Он использует методы PUT, GET, POST, DELETE HTTP протокола для манипуляции объектами. Кардинальное отличие его от SOAP в том, что REST остается HTTP-запросом.
Поскольку в PHP пока еще нет реалзации REST, мы воспользуемся Zend Framwork, в который включена реализация как REST клиента, так и REST севера.
Воспользуемся уже готовым классом CurrencyExchange. Напишем сам сервер:
rest.php:
<?php require_once 'config.php'; require_once 'Zend/Rest/Server.php'; Doctrine::loadModels('models'); $server = new Zend_Rest_Server(); $server->setClass( 'CurrencyExchange'); $server->handle(); ?>
Как видите все очень сходно и просто.
Однако, следует оговорить, что наш REST-сервис менее защищен, чем SOAP-сервис, так как любой добавленый метод в класс CurrencyExchange при его вызове отработает (сам класс определяет сруктуру сервиса).
Проверим работу нашего сервиса. Для этого достаточно передать параметры вызова метода в сроке GET-запроса:
?method=getExchange&code=840&date=2008-11-29
или
?method=getExchange&arg1=840&arg2=2008-11-29
При желании или необходимости вы можете самомтоятельно задавать структуру ваших XML ответов для сервиса REST. В этом случае, также будет необходимо позаботиться и о создании определения типа вашего XML документа (DTD — Document Type Definition). Это будет минимальным описанием API вашего сервиса.
Простейший тестовый клиент к REST сервису может быть в нашем случае таким:
<?php $client = new Zend_Rest_Client( 'http://mikhailstadnik.com/ctws/rest.php'); $result = $client->getExchange( 840, date( 'Y-m-d'))->get(); if ($result->isSuccess()) { echo 'USD exchange: ' . $result->response; } ?>
В принципе, Zend_Rest на сегодняшний день нельзя назвать наиболее точной реализацией принципов REST. Утрируя, можно говорить о том, что эта реализация свелась к удаленному вызову процедур (RPC), хотя философия REST гораздо шире.
Вы можете скачать пример в исходных кодах c PHP Doctrine и Zend Framework (4,42 Мб).
Заключение
Мы выполнили задачу минимум и показали, что такое веб-сервисы, для чего они нужны и как их реализовывать. Естественно, приведенный пример, возможно, несколько оторван от жизни, но он был выбран лишь в качестве инструмента для объяснения предмета и сущности веб-сервисов.
Кроме того мы увидели, что реализация веб-сервиса — задача довольно простая при использовании современного инструментария, который позволяет сконцентрироваться, в первую очередь, на разработке функциональности самого сервиса, не заботясь о низкоуровневой реализации протоколов.
Автор надеется, что данный материал будет действительно полезен тем, кто становится на тропу разработки веб-служб.
Удачи в девелопменте!
Web Service is a web-based application which is designed to interact with other applications over the internet. Also, we can use the protocols of the web services used by the web applications.
The Web service customers invoke calls method on remote objects by using SOAP and HTTP in the Web. Therefore, It is an independent Web Service which can be communicated by using standard web protocols and data formats, such as HTTP, XML, and SOAP.
SOAP is frequently used in web service and it stands for simple object access protocol which is a remote call method function that only executes with remote machine and converts the object communication into XML format sent via HTTP.
There are three elements in web service development as follows.
- Creating the web service
- Creating a proxy
- Consuming the web service
How to create the web service
There are some checkpoints for creating the web service as follows
Step 1: Open your visual studio and select File> New> Website>ASP.NET web service
Step 2: A web service file contains its file extension name with Service.asmx and its code-behind file page, Service.cs gets created in the App_Code directory of the main project.
Now, open your file with the name extension of Service.cs in web service website to write the code to get the details of the user from the database. Before the WebMethod in Service.cs first you need to add following namespaces as follows.
<%@ WebService Language="C#" Class="GetInfo" %> using System; using System.Data; using System.Data.SqlClient; using System.Web.Services; [WebService(Description="My Suppliers List Web Service")] public class GetInfo : WebService { [WebMethod(BufferResponse=true)] public DataSet ShowSuppliers (string str) { SqlConnection dbConnection = new SqlConnection("server=(local); uid=sa;pwd=;database=Northwind;"); SqlDataAdapter objCommand = new SqlDataAdapter ("select ContactName, CompanyName, City, Phone from Suppliers where Country = '" + str + "' order by ContactName asc", dbConnection); DataSet DS = new DataSet(); objCommand.Fill(DS); return DS; dbConnection.Close(); dbConnection = null; } }
The <%@ WebService Language=”C#” Class=” GetInfo” %> directive setup file in a Web Service, which gives it an appropriate name and specify the language it uses. Once you add the namespaces then write the following method GetUserDetails in Service.cs file.
Step 3: Here you need to change the file name of stockservice.asmx to stockservice.cs which contain simply a web service directive on it.
<%@ WebService Language="C#" CodeBehind="~/App_Code/StockService.cs" Class="StockService" %>
Step 4: Then, open this service.cs file and the simple code “Hello World” generated with the basic code as follows.
Script with namespaces
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; namespace StockService { // <summary> // Summary description for Service1 // <summary> [WebService(Namespace = "http://zigzag.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem(false)] // To allow this Web Service to be called from script, // using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class Service1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } } }
Step 5: Now change your code-behind the file page and add the 2D string arrays for the stock symbol, name, price, and two web calls methods for getting the stock information.
Script with namespaces
using System; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; [WebService(Namespace = "http://zigzag.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] // To allow this Web Service to be called from script, // using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class StockService : System.Web.Services.WebService { public StockService () { //Uncomment the following if using designed components //InitializeComponent(); } string[,] stocks = { {"TATAIND", "TATA Industries", "1060.15"}, {"ICICI", "ICICI Bank", "911.55"}, {"JSW", "JSW Steel", "1201.25"}, {"WIPRO", "Wipro Limited", "1194.65"}, {"HCL", "HCL Computers", "91.10"} }; [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] public double GetPrice(string symbol) { //it takes the symbol as parameter and then returns price for (int i = 0; i < stocks.GetLength(0); i++) { if (String.Compare(symbol, stocks[i, 0], true) == 0) return Convert.ToDouble(stocks[i, 2]); } return 0; } [WebMethod] public string GetName(string symbol) { // It takes the symbol as parameter, returns name of the stock for (int i = 0; i < stocks.GetLength(0); i++) { if (String.Compare(symbol, stocks[i, 0], true) == 0) return stocks[i, 1]; } return "Stock Not Found"; } }
Step 6: Now, run your web service application which gives a web service test page, which allows testing the service methods. Then click on that method name and check if it runs properly or not.
Consuming the Web Service
While using the web service, you need to create a website under the same solution explorer window. For this reason, A web page calls the web service which contains a label control to display the results and 2 control buttons, one for a post back and other for calling the web services. There are some steps as follows.
Step 1: You need to click on “WebServicesDemo” in the window explorer and then you need to add new asp.net web application project and give a proper name like as “CalculatorWebApplication”
Step 2: Then add a reference to web service by clicking on References folder in the CalculatorWebApplication project name and then you need to select Add Service Reference option. Now type the web service address and press the “GO” button in the Address text box of the Add Service Reference window. For this reason, In the namespace textbox type CalculatorService and click on “OK” button in solution explorer window.
Step 3: Then, click on the CalculatorWebApplication project in solution explorer window and add web form.
Step 4: Now, copy and paste the following HTML code as follows
HTML Script
<table style="font-family: Arial"> <tr> <td> <b>First Number</b> </td> <td> <asp:TextBox ID="txtFirstNumber" runat="server"></asp:TextBox> </td> </tr> <tr> <td> <b>Second Number</b> </td> <td> <asp:TextBox ID="txtSecondNumber" runat="server"></asp:TextBox> </td> </tr> <tr> <td> <b>Result</b> </td> <td> <asp:Label ID="lblResult" runat="server"></asp:Label> </td> </tr> <tr> <td colspan="2"> <asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="btnAdd_Click" /> </td> </tr> </table>
Step 5: Then, Copy and paste the following code into the code-behind file
protected void btnAdd_Click(object sender, EventArgs e) { CalculatorService.CalculatorWebServicesSoapClient client = new CalculatorService.CalculatorWebServicesSoapClient(); int result = client.Add(Convert.ToInt32(txtFirstNumber.Text), Convert.ToInt32(txtSecondNumber.Text)); lblResult.Text = result.ToString(); }
The file content for the web application as follows:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="wsclient._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <asp:Label ID="lblmessage" runat="server"></asp:Label> <asp:Button ID="btnpostback" runat="server" onclick="Button1_Click" Text="Post Back" style="width:132px" /> <asp:Button ID="btnservice" runat="server" onclick="btnservice_Click" Text="Get Stock" style="width:99px" /> </form> </body> </html>
The code-behind file page for the web application as follows:
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; //this is the proxy as you can see using localhost; namespace wsclient { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { lblmessage.Text = "First Loading Time: " + DateTime.Now.ToLongTimeString } else { lblmessage.Text = "PostBack at: " + DateTime.Now.ToLongTimeString(); } } protected void btnservice_Click(object sender, EventArgs e) { StockService proxy = new StockService(); lblmessage.Text = String.Format("Current HCLPrice:{0}", proxy.GetPrice("HCL").ToString()); } } }
How to Use Web service in a web application with a proxy server
There are some checkpoints for using a web service in web applications as follows.
Step 1: First of all, open your visual studio and File>New> Website> ASP.NET website, then click on the “OK” button in solution explorer window.
Step 2: Now right click on solution explorer and select “Add web reference”.
Step 3: Once you add “Select web reference”, a new window will pop up like this
Step 4: You need to enter your locally deployed web service link and press on “Go” button after that your web service will be found and the output will look like this as follows.
Step 5: Press a button “Add Reference” then the web service will add successfully. Open your Default.aspx page and, make your design like this as follows.
<html xmlns="http://www.zigzag.org/1999/xhtml"> <head runat="server"> <title>Getting Data from WebService</title> </head> <body> <form id="form1" runat="server"> <div> <table> <tr> <td> <b>Enter UserName:</b> </td> <td> <asp:TextBox ID="txtUserName" runat="server"></asp:TextBox> </td> <td> <asp:Button ID="btnSubmit" runat="server" Text="Submit" onclick="btnSubmit_Click" /> </td> </tr> </table> </div> <div> <asp:GridView ID="gvUserDetails" runat="server" EmptyDataText="No Record Found"> <RowStyle BackColor="#EFF3FB" /> <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /> <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> <AlternatingRowStyle BackColor="White" /> </asp:GridView> </div> </form> </body> </html>
For this reason, use some following namespaces in the code behind, then your final code will look like this
Script After Nameapsces
protected void Page_Load(object sender, EventArgs e) { if(!IsPostBack) { BindUserDetails(""); } } protected void BindUserDetails(string userName) { localhost.Service objUserDetails = new localhost.Service(); DataSet dsresult = new DataSet(); XmlElement exelement = objUserDetails.GetUserDetails(userName); if(exelement!=null) { XmlNodeReader nodereader = new XmlNodeReader(exelement); dsresult.ReadXml(nodereader, XmlReadMode.Auto); gvUserDetails.DataSource = dsresult; gvUserDetails.DataBind(); } else { gvUserDetails.DataSource = null; gvUserDetails.DataBind(); } } protected void btnSubmit_Click(object sender, EventArgs e) { BindUserDetails(txtUserName.Text); }
Step 6: Now simply execute this code and you will get the final output.
Note: The interviewer may ask you some questions related to consuming a web service in your interview like How proxy class can be generated, What is the use of a proxy class in the web application, What happens, if a web service refers a web page. I will tell you about all of them with the proper answer.
This information can be used by the visual studio, where you can create the proxy class. Then, The client web applications call the proxy class method function. The proxy class function serializes the parameters in web service, then prepares a SOAP (Simple Object Acces Protocol) request message and sends it back to the web service.
The web service runs this method and gives a SOAP response message to the proxy as output. The proxy class then deserializes the SOAP response message and sends to the client web application. We do not need to serialize or deserialize .NET CLR (Common Language Runtime) objects from SOAP format window. As a result, the only proxy class takes care of serialization and deserialization of response messages and makes the life of a developer much easier to develop a web service with a proxy server.
How to use ASP.NET Session State in a Web Service
In this session, you will see how to use asp.net session variables in a web service. To create asp.net session object in a web service, the web service class should inherit from property System.Web.Services.WebService and EnableSession class of WebMethod attribute set to be true.
So, let’s understand how to use Session object with the Calculator Service that we already built above. So, we want to execute all the calculations that a user has performed as given below. Finally, The steps to get this.
Step 1: First of all, you need to copy and paste the following code into CalculatorWebServices.asmx file as follows
Script with namespaces
using System.Web.Services; using System.Collections.Generic; namespace WebServicesDemo { [WebService(Namespace = "http://zigzag.com/webservices")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class CalculatorWebServices : System.Web.Services.WebService { [WebMethod(EnableSession = true)] public int Add(int firstNumber, int secondNumber) { List<string> calculations; if (Session["CALCULATIONS"] == null) { calculations = new List<string>(); } else { calculations = (List<string>)Session["CALCULATIONS"]; } string strTransaction = firstNumber.ToString() + " + " + secondNumber.ToString() + " = " + (firstNumber + secondNumber).ToString(); calculations.Add(strTransaction); Session["CALCULATIONS"] = calculations; return firstNumber + secondNumber; } [WebMethod(EnableSession = true)] public List<string> GetCalculations() { if (Session["CALCULATIONS"] == null) { List<string> calculations = new List<string>(); calculations.Add("You have not performed any calculations"); return calculations; } else { return (List<string>)Session["CALCULATIONS"]; } } } }
Step 2: Here you need to update the proxy class in the client application CalculatorWebApplication. For this reason, you need to right click on CalculatorService in Service References folder and then select Update Service Reference option in the solution explorer.
Step 3: So, again you need to copy and paste the following HTML code in WebForm1.aspx
<table style="font-family: Arial"> <tr> <td> <b>First Number</b> </td> <td> <asp:TextBox ID="txtFirstNumber" runat="server"></asp:TextBox> </td> </tr> <tr> <td> <b>Second Number</b> </td> <td> <asp:TextBox ID="txtSecondNumber" runat="server"></asp:TextBox> </td> </tr> <tr> <td> <b>Result</b> </td> <td> <asp:Label ID="lblResult" runat="server"></asp:Label> </td> </tr> <tr> <td colspan="2"> <asp:Button ID="btnAdd" runat="server" Text="Add" OnClick="btnAdd_Click" /> </td> </tr> <tr> <td> <asp:GridView ID="gvCalculations" runat="server"> </asp:GridView> </td> </tr> </table>
Step 4: Here copy and paste the following HTML code in WebForm1.aspx.cs
Script with namespaces
using System; namespace CalculatorWebApplication { public partial class WebForm1: System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnAdd_Click(object sender, EventArgs e) { CalculatorService.CalculatorWebServicesSoapClient client = new CalculatorService.CalculatorWebServicesSoapClient(); int result = client.Add(Convert.ToInt32(txtFirstNumber.Text), Convert.ToInt32(txtSecondNumber.Text)); lblResult.Text = result.ToString(); gvCalculations.DataSource = client.GetCalculations(); gvCalculations.DataBind(); gvCalculations.HeaderRow.Cells[0].Text = "Recent Calculations"; } } }
Step 5: In web.config file of CalculatorWebApplication, you need to set allowCookies attribute set to be true.
<basicHttpBinding> <binding allowCookies="true" name="CalculatorWebServicesSoap" /> </basicHttpBinding>
Once, you allow the attribute is set to true with the cookie, then the client application takes this cookie returned from the ASMX extension web service, and copy it into all coming future requests that are made in the web service. Hence, you can maintain the same session between the client and the web service.
How to Call ASP.NET web service from javascript using ajax
In this session, we will learn how to call asp.net web service method functions from JavaScript with the help of asp.net Ajax.
So, this we want to get as output below. When we type student ID in the textbox column and once we click “Get Student” button we want to get as follows the steps.
- First of all, call StudentWebService from javascript by using AJAX.
- The student web service must return the specific data of student from a database table.
- The data which returned that must be displayed in the textbox controls on the web form.
For this reason, we need to create a table tblStudents, here is the script for the following table.
Step 1: Create a tblStudents table
Script For Table tblStudent
Create Table tblStudents ( ID int identity primary key, Name nvarchar(50), Gender nvarchar(20), TotalMarks int ) Insert into tblStudents values('Mark Hastings','Male',900) Insert into tblStudents values('Pam Nicholas','Female',760) Insert into tblStudents values('John Stenson','Male',980) Insert into tblStudents values('Ram Gerald','Male',990) Insert into tblStudents values('Ron Simpson','Male',440) Insert into tblStudents values('Able Wicht','Male',320) Insert into tblStudents values('Steve Thompson','Male',983) Insert into tblStudents values('James Bynes','Male',720) Insert into tblStudents values('Mary Ward','Female',870) Insert into tblStudents values('Nick Niron','Male',680)
Finally, you get the output like as
Step 2: Here. we need to create a stored procedure to get student data from tblStudents table by student ID. Here is the script for this.
Create Proc spGetStudentByID @ID int as Begin Select ID, Name, Gender, TotalMarks from tblStudents where ID = @ID End
Step 3: Now, you need to create a new asp.net empty web application and give an appropriate name to it i.e WebServicesDemo
Step 4: Click on WebServicesDemo project in the explorer window and then add a class file and give a proper name for it i.e Student.cs. Finally, copy and paste the following code as follows.
Script with namespaces
namespace WebServicesDemo { public class Student { public int ID { get; set; } public string Name { get; set; } public string Gender { get; set; } public int TotalMarks { get; set; } } }
Step 5: Click on WebServicesDemo project in the explorer window and then add a web service and give a proper name like StudentService.asmx.
Step 6: Now copy and paste the given code in StudentService.asmx.cs file. Just to make sure System.Web.Script.Services.ScriptService attribute is completely included. This attribute only allows a web service to be called from JavaScript with the help of asp.net Ajax. Here is the script for this as follows.
Script with namespaces
using System; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Web.Services; namespace WebServicesDemo { [WebService(Namespace = "http://zigzag.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] [System.Web.Script.Services.ScriptService] public class StudentService : System.Web.Services.WebService { [WebMethod] public Student GetStudentByID(int ID) { Student student = new Student(); ; string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString; using(SqlConnection con = new SqlConnection(cs)) { SqlCommand cmd = new SqlCommand("spGetStudentByID", con); cmd.CommandType = CommandType.StoredProcedure; SqlParameter parameter = new SqlParameter("@ID", ID); cmd.Parameters.Add(parameter); con.Open(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { student.ID = Convert.ToInt32(reader["ID"]); student.Name = reader["Name"].ToString(); student.Gender = reader["Gender"].ToString(); student.TotalMarks = Convert.ToInt32(reader["TotalMarks"]); } } return student; } } }
Step 7: Click on WebServicesDemo project in the explorer window and then add a web form. This must add WebForm1.aspx.
Step 8: Now, copy and paste the following HTML code in opening and closing html tag <html></html> in WebForm1.aspx. Here is the script for the follwing code.
HTML script
<head runat="server"> <title></title> function GetStudentById() { var id = document.getElementById("txtStudentId").value; WebServicesDemo.StudentService.GetStudentByID(id, GetStudentByIdSuccessCallback, GetStudentByIdFailedCallback); } function GetStudentByIdSuccessCallback(result) { document.getElementById("txtName").value = result["Name"]; document.getElementById("txtGender").value = result["Gender"]; document.getElementById("txtTotalMarks").value = result["TotalMarks"]; } function GetStudentByIdFailedCallback(errors) { alert(errors.get_message()); } </head> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> <Services> <asp:ServiceReference Path="~/StudentService.asmx" /> </Services> </asp:ScriptManager> <table style="font-family:Arial; border:1px solid black"> <tr> <td><b>ID</b></td> <td> <asp:TextBox ID="txtStudentId" runat="server"></asp:TextBox> <input id="Button1" type="button" value="Get Student" onclick="GetStudentById()" /> </td> </tr> <tr> <td><b>Name</b></td> <td> <asp:TextBox ID="txtName" runat="server"></asp:TextBox> </td> </tr> <tr> <td><b>Gender</b></td> <td> <asp:TextBox ID="txtGender" runat="server"></asp:TextBox> </td> </tr> <tr> <td><b>Total Marks</b></td> <td> <asp:TextBox ID="txtTotalMarks" runat="server"></asp:TextBox> </td> </tr> </table> <h1>
Note: The time given below does not change, once we click Get Student button as we are doing partial page postback and not a full page postback.
</h1> <asp:Label ID="lblPageTime" runat="server"></asp:Label> </form> </body>
Step 9: In the end, copy and paste the following given code in Page_Load() event of WebForm1.aspx.cs file.
lblPageTime.Text = DateTime.Now.ToString();
Consequently, more questions can be asked by an interviewer in your interview, these are some following questions and their related answers which will help you in your interview as follows.
Question 1: Explain about object-oriented web application such as ASP.NET web application, use of web services to get access a relational database?
In the above examples, we have discussed exactly the same concept which you need it. ASP.NET web applications call the web service, and then the web service has ado.net code to fetch data from a relational database system.
Same as with asp.net web application, a web service only works with any type of datastore (Relational databases, XML file, access, excel)
Question 2: How ADO.NET and XML web services make the effect on architecture?
Some of the real-time applications contain three or more effective layers, those are the most common layers in many of the web applications as follows
1. Presentation Layer (User Interface)- This layer maintains only the UI logic schema.
2. Business Logic Layer – This layer maintains logic to get validation in business rules.
3. Data Access Layer – This layer only performs the database CRUD operations like Create, Read, Update and Delete etc.
Question 3: How do you call a web service from the web form without getting reloaded the entire web page? or we can say, how do you call a web service without full page postback?
First of all, you need to call the web service with the help of using ASP.NET AJAX, that allows partial page postback. With partial page postback, the only specific portion of the page gets updated without getting reloaded the entire page. That’s really better for performance and ignores the screen flickers.
Conclusion
In this article, you will find the basic overview of ASP.NET web service that really helps to understand in an easy way for any fresher developer. Web services are the key elements of the so-called programmable Web.
They are very versatile software systems that really contain the potential to open up with a new era in software world like the age of interoperability. Web services can be used to set up business-to-business (B2B) transactions elements. They work great while exposing software functionality to customers.
- About
- Latest Posts
Веб-сервис – это веб-функциональность, доступ к которой осуществляется через веб-протоколы, используемые веб-приложениями. Существует три аспекта разработки веб-сервисов:
- Создание веб-сервиса
- Создание прокси
- Использование веб-службы
Создание веб-службы
Веб-сервис – это веб-приложение, которое представляет собой класс, состоящий из методов, которые могут использоваться другими приложениями. Он также следует архитектуре с выделенным кодом, такой как веб-страницы ASP.NET, хотя и не имеет пользовательского интерфейса.
Чтобы понять концепцию, давайте создадим веб-сервис для предоставления информации о цене акций. Клиенты могут запросить название и цену акции на основе символа акции. Для простоты этого примера значения жестко закодированы в двумерном массиве. Этот веб-сервис имеет три метода:
- Метод HelloWorld по умолчанию
- Метод GetName
- Метод GetPrice
Выполните следующие шаги для создания веб-службы:
Шаг (1) : Выберите Файл -> Создать -> Веб-сайт в Visual Studio, а затем выберите Веб-служба ASP.NET.
Шаг (2) : Файл веб-службы с именем Service.asmx и его код за файлом Service.cs создается в каталоге App_Code проекта.
Шаг (3) : Измените имена файлов на StockService.asmx и StockService.cs.
Шаг (4) . Файл .asmx содержит просто директиву WebService:
<%@ WebService Language="C#" CodeBehind="~/App_Code/StockService.cs" Class="StockService" %>
Шаг (5) : Откройте файл StockService.cs, сгенерированный в нем код является основным сервисом Hello World. Код веб-службы по умолчанию за файлом выглядит следующим образом:
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; namespace StockService { // <summary> // Summary description for Service1 // <summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem(false)] // To allow this Web Service to be called from script, // using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class Service1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } } }
Шаг (6) : Измените код, стоящий за файлом, чтобы добавить двумерный массив строк для символа акции, имени и цены, а также два веб-метода для получения информации об акции.
using System; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] // To allow this Web Service to be called from script, // using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class StockService : System.Web.Services.WebService { public StockService () { //Uncomment the following if using designed components //InitializeComponent(); } string[,] stocks = { {"RELIND", "Reliance Industries", "1060.15"}, {"ICICI", "ICICI Bank", "911.55"}, {"JSW", "JSW Steel", "1201.25"}, {"WIPRO", "Wipro Limited", "1194.65"}, {"SATYAM", "Satyam Computers", "91.10"} }; [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] public double GetPrice(string symbol) { //it takes the symbol as parameter and returns price for (int i = 0; i < stocks.GetLength(0); i++) { if (String.Compare(symbol, stocks[i, 0], true) == 0) return Convert.ToDouble(stocks[i, 2]); } return 0; } [WebMethod] public string GetName(string symbol) { // It takes the symbol as parameter and // returns name of the stock for (int i = 0; i < stocks.GetLength(0); i++) { if (String.Compare(symbol, stocks[i, 0], true) == 0) return stocks[i, 1]; } return "Stock Not Found"; } }
Шаг (7) . Запуск приложения веб-службы дает тестовую страницу веб-службы, которая позволяет тестировать методы службы.
Шаг (8) : Нажмите на имя метода и проверьте, правильно ли он работает.
Шаг (9) : Для тестирования метода GetName, предоставьте один из символов акции, которые жестко закодированы, он возвращает название акции
Использование веб-службы
Для использования веб-службы создайте веб-сайт под тем же решением. Это можно сделать, щелкнув правой кнопкой мыши имя решения в обозревателе решений. Веб-страница, вызывающая веб-службу, должна иметь элемент управления меткой для отображения возвращаемых результатов и два элемента управления кнопки, один для отправки назад, а другой для вызова службы.
Файл содержимого для веб-приложения выглядит следующим образом:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="wsclient._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <h3>Using the Stock Service</h3> <br /> <br /> <asp:Label ID="lblmessage" runat="server"></asp:Label> <br /> <br /> <asp:Button ID="btnpostback" runat="server" onclick="Button1_Click" Text="Post Back" style="width:132px" /> <asp:Button ID="btnservice" runat="server" onclick="btnservice_Click" Text="Get Stock" style="width:99px" /> </div> </form> </body> </html>
Код файла для веб-приложения выглядит следующим образом:
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; //this is the proxy using localhost; namespace wsclient { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { lblmessage.Text = "First Loading Time: " + DateTime.Now.ToLongTimeString } else { lblmessage.Text = "PostBack at: " + DateTime.Now.ToLongTimeString(); } } protected void btnservice_Click(object sender, EventArgs e) { StockService proxy = new StockService(); lblmessage.Text = String.Format("Current SATYAM Price:{0}", proxy.GetPrice("SATYAM").ToString()); } } }
Создание прокси
Прокси-сервер является заменой для кодов веб-службы. Перед использованием веб-службы необходимо создать прокси. Прокси-сервер зарегистрирован в клиентском приложении. Затем клиентское приложение выполняет вызовы веб-службы, как если бы они использовали локальный метод.
Прокси принимает вызовы, упаковывает их в надлежащий формат и отправляет на сервер в виде SOAP-запроса. SOAP означает простой протокол доступа к объектам. Этот протокол используется для обмена данными веб-службы.
Когда сервер возвращает пакет SOAP клиенту, прокси-сервер декодирует все и представляет его клиентскому приложению.
Перед вызовом веб-службы с использованием btnservice_Click, веб-ссылка должна быть добавлена в приложение. Это прозрачно создает прокси-класс, который используется событием btnservice_Click.
protected void btnservice_Click(object sender, EventArgs e) { StockService proxy = new StockService(); lblmessage.Text = String.Format("Current SATYAM Price: {0}", proxy.GetPrice("SATYAM").ToString()); }
Выполните следующие шаги для создания прокси:
Шаг (1) : Щелкните правой кнопкой мыши запись веб-приложения в обозревателе решений и выберите «Добавить веб-ссылку».
Шаг (2) : выберите «Веб-службы в этом решении». Возвращает ссылку на StockService.
Шаг (3) : При нажатии на сервис открывается тестовая веб-страница. По умолчанию созданный прокси называется localhost, вы можете переименовать его. Нажмите «Добавить ссылку», чтобы добавить прокси в клиентское приложение.
Включите прокси в код файла, добавив:
Web Service
На главную страницу
Аннотация: Данная статья написана когда автор столкнулся с необходимостью использования Web сервисов
в поставляемом в фирму ПО. До этого как то обходились без Web сервисов. Литературы в инете по данному вопросу много и много прочитано,
но очень многое еще и остается темными пятнами. Поэтому, по мере накопления знаний, статья будет модифицироваться и уточняться.
Автор будет благодарен за любые замечания и уточнения. Адрес почты – найдете на главной странице сайта по ссылке “Об авторе”.
Весь материал разработан в Visual Studio Net 2010 в Windows 7
-
Параграф 1. Вместо предисловия
-
Параграф 2. Создаем WCF web сервис
-
Параграф 3. Публикация Web сервиса
-
Параграф 4. Создание клиентских Windows и Web приложений, использующих Web службу
-
Параграф 6. Совмещение проектов для удобства отладки Web сервисов
-
Параграф 7. О параметрах вызова методов Web Service
В начало
Параграф 1. Вместо предисловия
Веб-служба, веб-сервис (web service) — программная система, идентифицируемая строкой URI,
чьи общедоступные интерфейсы определены на языке XML (eXtensible Markup Language).
Благодаря веб-сервисам функции любой программы могут стать доступными через Интернет – программы могут
обращаться к какой-нибудь программе, работающей на другом сервере (т.е. к веб-сервису), и использовать ответ, полученный от нее
на своем веб-сайте, или в приложении.
Веб-службы обеспечивают взаимодействие программных систем независимо от платформы. Они
основаны на базе открытых стандартов и протоколов. Благодаря использованию XML достигается простота разработки и отладки веб-служб.
Используемые стандарты
-
XML: Расширяемый язык разметки, предназначенный для хранения и передачи структурированных данных;
-
SOAP (Simple Object Access Protocol): Протокол обмена сообщениями на базе XML;
-
WSDL (Web Services Description Language): Язык описания внешних интерфейсов веб-службы на базе XML;
-
UDDI: Универсальный интерфейс распознавания, описания и интеграции (Universal Discovery, Description and Integration).
Каталог веб-служб и сведений о компаниях, предоставляющих веб-службы во всеобщее пользование или конкретным компаниям.
Для создания Web сервиса в Visual Studio Net воспользуемся темплатой “WCF Server Application” (меню “File/New Project”) и дадим ему имя
“MyFirstWebService” (Рис.1). Сразу отметим, что мы создаем непривычный для предыдущих Net Framework web сервис –
WCF (Windows Communication Foundation). WCF — программный фреймворк, используемый для обмена данными между приложениями входящими в
состав .NET Framework. До Net Framework 4 использовался немного другой сервис (его мы можем найти, если сменим в окне “.Net Framework 4”,
на “.Net Framework 3.5” и найдем темплату ASP.NET Web Service Application). Создав проект на базе этой темплаты, мы найдем привычные .asmx файлы,
которых, как видно из Рис.2. нет в проекте WCF сервиса. Это не просто смена имен файлов, а смена технологии –
WCF делает возможным построение безопасных и надёжных транзакционных систем через упрощённую унифицированную программную модель
межплатформенного взаимодействия. Комбинируя функциональность существующих технологий .NET по разработке распределённых приложений
(ASP.NET XML Web Services — ASMX, WSE 3.0, .NET Remoting, .NET Enterprise Services и System.Messaging).
WCF предоставляет единую инфраструктуру разработки, повышающую производительность и снижающую затраты на создание безопасных,
надёжных и транзакционных Web-служб нового поколения.
В начало
Параграф 2. Создаем WCF web сервис
Собственно говоря мы уже приступили к его созданию (см.выше). На Рис.1. показан выбор темплаты и задание имени службы – “MyFirstWebService” и
таким же оставим и имя проекта. Если мы планируем тестировать службу перед применением и будем создавать Host и клиентское приложение для работы,
то имена службы и проекта следует разделить. После нажатия кнопки “OK” служба практически создана.
Рис.1. Создание Web сервиса WCF
Рис.2. Создание Web сервиса WCF
Сервис WCF представлен основным файлом Service1.svc.cs (Рис.2.), где размещены методы сервиса, IService1.cs – методы интерфейса и два файла
Web.config для двух режимов. Кроме того обратим внимание на закладке References и в используемых пространствах имен на ссылки System.ServiceModel:
using System.ServiceModel; using System.ServiceModel.Web;
Стартовый пример показывает и то, как вводить данные собственных типов ([DataContract]):
namespace MyFirstService { [ServiceContract] public interface IService1 { [OperationContract] string GetData(int value); [OperationContract] CompositeType GetDataUsingDataContract(CompositeType composite); } [DataContract] public class CompositeType { bool boolValue = true; string stringValue = "Hello "; [DataMember] public bool BoolValue { get { return boolValue; } set { boolValue = value; } } [DataMember] public string StringValue { get { return stringValue; } set { stringValue = value; } } } }
Так как сервис создан, нажав F5, мы можем посмотреть его презентационное представление и указание на то, что делать дальше. А нажав
ссылку svcutil.exe http://localhost:3818/Service1.svc?wsdl – можем посмотреть с помощью “svcutil.exe” его XML содержание (.wsdl файл, в котором описывается, что сервис может делать
и с какими данными он может работать) – (Рис.3).
Рис.3. Web сервис WCF
В XML коде мы можем найти:
-
контракт сервиса (2 метода: GetData, GetDataUsingDataContract);
-
контракт данных (2 встроенных типа: int, string, + 1 собственный тип: CompositeType состоящий из bool и string);
-
сигнатуры методов (из wsdl:input message= и wsdl:output message=).
Для отладки сервиса можно использовать “WCF Test Client”. Выберем узел “Service1.svc” и в его контекстном меню выберем пункт
“Set As Start Page” и нажмем F5. Теперь появится окно “WCF Test Client” (Рис.4.). В нем мы можем просмотреть и протестировать наши методы
и посмотреть их XML реализацию.
Рис.4. Использование WCF Test Client
Наполним сервис своим содержанием, например, поставим ему задачу проверять валидность почтовых адресов, для чего в файле
IService1.cs оставим один контакт(OperationContract).
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace MyFirstWebService { [ServiceContract] public interface IService1 { [OperationContract] string ValidateAddress(string address); } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace MyFirstWebService { public class Service1 : IService1 { public string ValidateAddress(string address) { string pattern = @"^([0-9a-zA-Z]([-.w]*[0-9a-zA-Z])*@(([0-9a-zA-Z])+([-w]*[0-9a-zA-Z])*.)+[a-zA-Z]{2,9})$"; if (Regex.IsMatch(address, pattern)) { return address + " is valid"; } else { return address + " is no valid"; } } } }
В принципе, если мы уверены в работоспособности службы, то мы можем ее опубликовать.
В начало
Параграф 3. Публикация Web сервиса
Опубликуем наш сервис. Режим компиляции выберем “Release”, на всякий случай перекомпилируем службу (меню “Build/RebuildMyFirstService”) и далее
выбираем меню “Build/Publish MyFirstService” (Рис.5.):
Рис.5. Публикация службы
На Рис.6. показано, что мы публикуем службу туда, куда IIS нам определил сайт по умолчанию (Default Web Site). Это сделано для удобства.
В принципе, когда мы работаем “на дядю”, то есть, сайт у нас на другой машине, то можно опубликовать в любое место, а затем скопировать
файлы сборки в нужное место, а далее с помощью тамошнего IIS сделать директорию сборки приложением. Еще один момент – не рекомендуется менять имя
сервиса.
Рис.6. Публикация службы
Теперь превратим нашу папку сборки в приложение IIS.
Рис.7. Создание приложения
Рис.8. Создание приложения
Осталось проверить работоспособность службы, как показано на Рис.9., и доступность кода XML, как это делали выше, нажав ссылку
http://localhost/MyFirstWebService/Service1.svc?wsdl:
Отметим, что для выборки службы мы использовали вызов
http://localhost/MyFirstWebService/service1.svc
Рис.9. Проверка службы
В начало
Параграф 4. Создание клиентских Windows и Web приложений, использующих Web службу
Далее создадим новый проект – либо консольное, либо WindowsApplication или Asp.Net приложение, которое будет обращаться к службе.
У нас будет возможность проверить, являются ли действительными указанные адреса электронной почты, или, по крайней мере удовлетворяющими
нашему регулярному выражению. Я создал обычное ASP.Net Web приложение (Рис.10.):
Рис.10. Создание ASP.NET приложения
Поместим на форму два контрола: Button и Label и добавим ссылку на наш сервис как показано на Рис.11-17.
Рис.11. Создание ASP.NET приложения
Рис.12. Добавление ссылки на сервис
Рис.13. Добавление ссылки на сервис
Рис.14. Добавление ссылки на сервис
Если сервис не отображается – введите его адрес и нажмите зеленую кнопочку справа:
Рис.15. Добавление ссылки на сервис
Задайте имя сервису для приложения и нажмите кнопочку “Add Reference”:
Рис.16. Добавление ссылки на сервис
Рис.17. Ссылка на сервис добавлена
Добавим код в приложение, как показано на Рис.18.
Рис.18. Код приложения
Испытаем приложение – результат показан на Рис.19.
Рис.19. Выполнение ASP.NET приложения
Проделав все то же cамое для Windows приложения, получим тот же результат (Рис.20):
Рис.20. Выполнение Windows приложения
В начало
Параграф 6. Совмещение проектов для удобства отладки Web сервисов
Возьмем наш проект в том виде, в котором он изображен на Рис.5. – иначе на момент когда мы создали наш сервис.
Переименуем решение из MyFirstService в FirstService, воспользовавшись контекстным меню, пункт “Rename”.
К решению добавим, например Console Application (контекстное меню решения, пункты “Add/New Project” – темплата “Console Application” (закладка “Windows”)).
Не меняя имени приложения нажмем кнопку “OK”. Получим результат, показанный на Рис.21.
Рис.21. Сервис и консольное приложение
Кликаем в Solution Exploreре на узле CondoleApplication1 и в контекстном иеню выбираем “Add Service Reference” (Рис.22.).
Рис.21. Сервис и консольное приложение
Далее повторяем шаги, показанные на Рис.12-14. На шаге Рис.14. выбираем “Web Services in This Solution” (Рис.23.).
Рис.23. Добавление сервиса из текущего проекта
Выбираем Service1 и даем ему имя, например “myservice”, нажимаем кнопку “Add Reference” (Рис.24.).
Рис.24. Добавление сервиса из текущего проекта
В проет ConsoleApplication добавляем пространство имен:
using ConsoleApplication1.myservice;
и код
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ConsoleApplication1.myservice; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Service1 webservice = new Service1(); Console.WriteLine("Insert email adress!"); string str = Console.ReadLine(); str= webservice.ValidateAddress(str); Console.WriteLine(str); str = Console.ReadLine(); } } }
Кликаем в Solution Exploreре на узле CondoleApplication1 и в контекстном иеню выбираем пункт “Set as Startup Project”.
Запускаем приложение и получаем резельтат, как показано на Рис.25.
Рис.25. Исрользование Web сервиса в целях отладки приложения
После отладки приложения мы точно также можем публиковать наш сервис, как это описано выше.
В начало
Параграф 7. О параметрах вызова методов Web Service
Пока мы работали с методом, в котором все параметры строки, проблем не было с вызовом метода, ровно, как и с тем как, и сколько параметров
определено в файле интерфейса, и с тем, как и столько параметров используется.
Однако. Если мы зададим в IService1.cs контакт с параметрами типа int или другими, отличными от строковых, например:
[OperationContract] int square(int value);
При этом в файле Service1.svc.cs определим его, как метод возведения числа в квадрат:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace MyFirstService { public class Service1 : IService1 { public int square(int p) { return (p*p); } } }
Вновь добавим web ссылку на service в консольном приложении, как это сделано в параграфе 6. И теперь попытаемся
использовать наш метод:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using ConsoleApplication1.myService; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Service1 webservice = new Service1(); Console.WriteLine("Insert number!"); string str = Console.ReadLine(); int a=webservice.square(Convert.ToInt32(str)); Console.ReadLine(); }
То получим ошибку:
Error 1 No overload for method 'square' takes 1 arguments E:ServiceFirstServiceConsoleApplication1Program.cs 18 21 ConsoleApplication1
Кликнув правой кнопкой мышки на методе “square” и выбрав в контекстном меню “Go To Defination”,
попадем в файл “Reference.cs”, где увидим, что наш метод получил серьезное преобразование:
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/IService1/square", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] public void square(int value, [System.Xml.Serialization.XmlIgnoreAttribute()] bool valueSpecified, out int squareResult, [System.Xml.Serialization.XmlIgnoreAttribute()] out bool squareResultSpecified) { object[] results = this.Invoke("square", new object[]{value,valueSpecified}); squareResult = ((int)(results[0])); squareResultSpecified = ((bool)(results[1])); }
По крайней мере, параметров в методе стало 4. Прием первого параметра методом выглядит как обычно, а возврат результата осуществляется
через параметр типа “out”.
Два параметра “xxxSpecified” определяют действительность параметров в сериализованном XML документе. Эти преобразования как раз и связаны
с передачей XML документа в сериализованном виде.
В MSDN написано: “Сериализация XML– это процесс преобразования открытых свойств и полей объекта в серийный формат (в данном случае в
формат XML) для хранения и транспортировки. Десериализация пересоздает объект в его исходном состоянии из вывода XML.
Сериализацию можно представить в качестве способа сохранения состояния объекта в поток или буфер.
Например, ASP.NET использует класс XmlSerializer для кодирования сообщений веб-службы XML…. схема включает
использование двух параметров – один параметр для использования (System.ComponentModel.DefaultValueAttribute) значения по умолчанию,
другой параметр для использования специального шаблона с целью создания логического поля, определяемого XmlSerializer, и с целью применения
XmlIgnoreAttribute к полю. Шаблон создается в форме propertyNameSpecified. Например, при наличии поля с именем “MyFirstName” (Мое имя) также
будет создано поле с именем “MyFirstNameSpecified” (Мое имя указано), инструктирующее XmlSerializer о необходимости генерирования элемента
XML с именем “MyFirstName”
Таким образом, мы вынуждены мириться с изменением определенных в интерфейсе методов, например, в нашем примере выход из положения прост:
static void Main(string[] args) { Service1 webservice = new Service1(); Console.WriteLine("Insert number!"); string str = Console.ReadLine(); //Так работать не будет //int a = webservice.square(Convert.ToInt32(str)); int rez=0; bool f = false; //Так работает webservice.square(Convert.ToInt32(str),true,out rez,out f); Console.WriteLine(rez.ToString()); Console.ReadLine(); }
Молчанов Владислав 15.12.2011г.
В начало страницы
На главную страницу
К началу книги
Сайт управляется системой uCoz
Служба поиска Web-сервиса XML
Перед тем как клиент сможет использовать функциональные возможности Web-сервиса, ему нужно узнать о существовании и месте размещения этого сервиса. Если вы являетесь создателем и клиента, и Web-сервиса XML, фаза поиска оказывается очень простой, поскольку вы сами являетесь источником нужной информации. Но что делать, если вы хотите сделать возможности вашего Web-сервиса открытыми для всех?
Для этого вы можете зарегистрировать свой Web-сервис XML на сервере UDDI (Universal Description, Discovery, and Integration – универсальное описание, поиск и взаимодействие). Клиенты могут послать запрос к каталогу UDDI, чтобы получить список всех Web-сервисов, соответствующих заданным критериям поиска (например, “найти все Web-сервисы, связанные с получением метеорологических данных в реальном времени”). Идентифицировав подходящий Web-сервер в списке, возвращенном в результате UDDI-запроса, вы можете выяснить все возможности этого сервера. Если хотите, можете назвать UDDI “белой книгой” Web-сервисов XML.
В дополнение к UDDI-поиску, Web-сервис XML, построенный в рамках .NET, можно найти с помощью DISCO – этот несколько искусственный акроним расшифровывается, как Discovery of Web Services (поиск Web-сервисов). Используя файл статического поиска (*.disco) или динамического поиска (*.vsdisco), вы можете “афишировать” набор Web-сервисов XML, размещенных по конкретному адресу URL. Потенциальные клиенты Web-сервисов могут перейти к файлу *.disco Web-сервера, чтобы проверить связи всех опубликованных Web-сервисов XML.
Следует учитывать то, что по умолчанию динамический поиск отключен, поскольку имеется потенциальный риск нарушения защиты, если позволить IIS открыть весь набор Web-сервисов XML всем интересующимся объектам. В связи с этим службы DISCO здесь обсуждаться не будут.
Замечание. Если вы захотите активизировать поддержку динамического поиска для Web-сервера, прочитайте статью Q307303 базы знаний Microsoft на страницах http://support.microsoft.com
Читайте также
9.5.1. Безопасность сервиса
9.5.1. Безопасность сервиса
Когда я впервые знакомился с документацией на squid, то мне очень понравились следующие два параметра: cache_effective_user и cache_effective_group. Если squid запущен от имени администратора root, то идентификаторы пользователя и группы будут заменены на указанные в этих
11.4. Настройка DNS-сервиса
11.4. Настройка DNS-сервиса
В настоящее время наиболее распространенным сервисом DNS для Linux является bind. Для этого сервиса существует программа bindconf, которая имеет графический интерфейс и проста в использовании. Зайдите в графическую оболочку и в консоли выполните
Тип сервиса
Тип сервиса
В IP-пакетах предусмотрено специальное поле под названием TOS (Type-of-Service — тип сервиса). Это поле позволяет компонентам сети определять, какие из пакетов требуют специальной обработки. В результате подобной обработки для некоторых клиентов и серверов
10 Служба имен — DNS
10
Служба имен — DNS
Думаю, что не нужно в очередной раз рассказывать о преобразовании IP-адреса в имена компьютеров и о том, что выполняет служба DNS. Данному вопросу посвящены целые тома. Мы же давайте займемся непосредственно настройкой сервера DNS, который будет работать под
2.3.4 Служба WWW
2.3.4 Служба WWW
Word Wide Web (WWW) — наиболее привлекательная система из всех прикладных служб клиент/сервер, реализованных в TCP/IP. Пользователь может получить доступ к прекрасно оформленным документам, содержащим графические изображения и звуковые файлы, легко перемещаться
2.4.3 Служба имен DMS
2.4.3 Служба имен DMS
Для использования сетевых служб требуется способ идентификации удаленных компьютеров. Пользователи и программы могут указывать нужный компьютер по его имени, которое легко запомнить или ввести.Для создания соединения с хостом имя хоста должно быть
18.9 Служба WAIS
18.9 Служба WAIS
Gopher делает доступными для пользователей множество файлов. Однако пользователи нуждаются в инструменте для поиска в архиве полезных для себя текстовых документов. Большинство серверов gopher имеет поисковое средство — региональную информационную службу (Wide
C.1.2 Европейская служба NIC
C.1.2 Европейская служба NIC
Основная европейская служба NIC:RIPE Network Coordination Centre (RIPE NCC) (Registry for the European Region)Электронная почта: hostmaster@ripe.net, ncc@ripe.netТелефон: +31 20 592 5065Факс: +31 20 592 5090Почтовый адрес: RIPE NCCKruislaan 4091098 SJ AmsterdamThe NetherlandsСетевой координационный центр
Служба индексирования
Служба индексирования
Служба предназначена для индексации содержимого файлов на локальном диске с целью быстрого поиска при помощи оснастки ciadv.msc. В следующей главе будет подробно рассмотрена данная оснастка и работа с ней, а пока поговорим о службе. Служба
Служба сообщений
Служба сообщений
Служба управляет возможностью передачи сообщений сетевым компьютерам. Если эта служба будет отключена, то программы, ее использующие, не смогут передавать сообщения. В частности, будет отключена команда net send «компьютер» «сообщение», используемая
Служба индексирования
Служба индексирования
Раньше служба индексирования уже рассматривалась с точки зрения параметров реестра, влияющих на ее производительность. Сейчас же будет рассмотрена оснастка Служба индексирования: как с ее помощью определить каталоги для индексирования, а также
Служба W32Time
Служба W32Time
W32Time — это встроенная служба Microsoft Windows, выполняющая синхронизацию авторизованного сервера времени с внешним источником времени. Авторизованный сервер времени — это контроллер домена, использующий службу W32Time для обеспечения синхронизации параметров даты и
Служба описания Web-сервиса XML
Служба описания Web-сервиса XML
Итак, клиент знает, где размещен Web-сервис XML. Теперь клиент должен узнать функциональные возможности этого сервиса. Например, клиент должен иметь возможность узнать, что сервис имеет метод GetWeatherReport(), предполагающий использование некоторого
Установка клиента для поиска порта сервиса
Установка клиента для поиска порта сервиса
Если вы установили ваш сервер с инсталляционными значениями по умолчанию (сервис gds db прослушивает порт 3050), то конфигурирование не требуется. Если сервер прослушивает другой порт или используется другое имя сервиса порта, то
Служба и война
Служба и война
Анатолий собирался заниматься атомной физикой — хотя еще никто ничего не знал об атомной бомбе, но было ясно, что эта наука надолго будет одной из самых востребованных. Но висевшая в воздухе международная напряженность внесла свои коррективы: он проучился