Добрый день.
Версия 7.7.0.
Задача: Добавить кнопку в панель действия, по нажатию на которую отправляется SOAP запрос со страницы во внешнюю систему.
Кнопку в панель добавил, а с реализацией web-сервисов еще не знаком.
Где про это можно максимально подробно почитать?
Интересуют все этапы.

Нравится

3 комментария

Добрый день!
Надо сделать конфигурационный сервис (смотреть тут), либо бизнес процесс с элементом скриптом, который уже будет запрос со страницы во внешнюю систему. Как сделать запрос во внешнюю систему можно посмотреть тут

Сидоров Александр В.,

Добрый день.
Описал сервис:

[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle =
		WebMessageBodyStyle.Wrapped,
		ResponseFormat = WebMessageFormat.Json)]
		public string SoapRequest(string Name)
		{
			string _soapEnvelope = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:bp=\"http://********.ru\">" +
				"<soapenv:Header/>" +
					"<soapenv:Body>" +
						"<bp:CL_Integracija_CRM_Request>" +
							"<client>" +
								"<inn>7811496640</inn>" +
								"<kpp>781101001</kpp>" +
								"<id_abs>19505031632</id_abs>" +
							"</client>" +
							"<loan_app>" +
								"<product_code>вкл</product_code>" +
								"<summ>10000000</summ>" +
								"<term>24</term>" +
								"<rate>9</rate>" +
							"</loan_app>" +
							"<user_in>" +
								"<login>" + Name + "</login>" +
							"</user_in>" +
						"</bp:CL_Integracija_CRM_Request>" +
					"</soapenv:Body>" +
				"</soapenv:Envelope>"; 
			var request = (HttpWebRequest)WebRequest.Create("http://*******************/bp");
			request.Method = "POST";
			byte[] byteArray = Encoding.UTF8.GetBytes(_soapEnvelope);
			request.ContentType = "application/x-www-form-urlencoded";
			request.ContentLength = byteArray.Length;
			request.Timeout = 30 * 1000;
			using (var dataStream = request.GetRequestStream())
			{
				dataStream.Write(byteArray, 0, byteArray.Length);
				dataStream.Close();
			}
			var resp = (HttpWebResponse)request.GetResponse();
			Stream responseStream = resp.GetResponseStream();
			StreamReader sr = new StreamReader(responseStream);
            string s = sr.ReadToEnd();
            return s;
		}

Вызываю его из замещающего клиентского модуля: 

ServiceHelper.callService("UsrCustomConfigurationService", "SoapRequest", function(response) {
						//MaskHelper.HideBodyMask();
						if (response.ProcessRequestResult.ErrorMessage) {
							Terrasoft.utils.showInformation(response.ProcessRequestResult.ErrorMessage);
						} else if (!response.ProcessRequestResult.IsEmpty) {
							Terrasoft.utils.showInformation("Запрос успешно обработан. Файлы отчета прикреплены к заявке.");
						} else {
							Terrasoft.utils.showInformation("Запрос успешно обработан. По выбранному контакту данных нет.");
						}
						window.console.log(response.ProcedureSqlResult);
					}, serviceData, this);

но получаю ошибку: 

В web.config и services.config все прописал, в ServiceModel описание добавил
С чем это может быть связано?

stique,

Убедитесь, что добавлены атрибуты [ServiceContract] у класса и [OperationContract] у метода

Показать все комментарии

Здравствуйте, коллеги!

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

К сожалению, не нашел подробного описания возможностей этого элемента в технической документации.

Прошу помочь с реализацией следующей функции.

Имеется веб-сервис, имеющий корректное wsdl-определение. Сервис получает от процесса GET-команду (с параметром type ['jpeg', 'pdf', 'xml']) и в зависимости от параметра возвращает:
1) jpeg - изображение
2) pdf - файл документа
2) xml - со значениями полей в строках и изображениями в кодировке base64

по получении ответа процесс должен:
1) сохранить jpeg-файл в карточку контакта (например, фото контакта)
2) сохранить pdf-файл вложением в карточку контакта (например, цифровая копия подписанного договора обслуживания)
3) разобрать полученный xml-файл, создать новую карточку контакта и сохранить значения в соответствующие поля, включая закодированное base64 изображение (например, паспортные данные контакта с изображением подписи, фото и скана паспорта)

Буду благодарен за примеры кода.

Нравится

4 комментария

Добрый день!
Пока такого элемента, который бы вызывал внешние сервисы нет.
Для решения подобной задачи нужно писать в ScriptTask’е на .Net обработчик http запросов и в пространство имен (Usings) подключать нужные классы.
Примеры кода можно загуглить.

Спасибо, Олег!

Я посмотрел в дизайнере процессов установленного у нас экземпляра bpm'online 7.8. Там действительно нет того элемента, что я имел ввиду. Жаль, что я не помню его названия. Но в бета-версии, которую нам демонстрировали на мероприятии в Сколково в этом году в рамках сессии для администраторов, был такой элемент, который позволял вызывать внешние web-сервисы, при условии, что они оформлены в соответствии со стандартами по протоколу SOAP.

Очень прошу перепроверить с теми, кто делал ту презентацию. Юлия Старун там была, насколько я помню.

Заранее спасибо!

Добрый день !!!

если такой элемент процесса появится в дизайнере процессов, тогда BPMOnline станет самой крутой системой по сравнению с другими. Она и сейчас самая крутая система. Но с данным инструментом просто будет решать многие задачи.

Здравствуйте! Я зашел в дизайнер процессов из конфигурации системы. Элемент, который я имел ввиду называется "Выполнить действие процесса". В его настройках нужно указать Пользовательское действие "Вызвать веб-сервис" или "Вызвать Web-сервис".

Если выбрать первый вариант - "Вызвать веб-сервис", то во вкладке Параметров нужно указать следующие параметры:
- RequestBodyInternal
- RequestParameters
- URL сервиса
- Вернуть запрос и ответ действия
- Запрос
- Метод сервиса
- Ответ
- Параметры запроса
- Результат запроса
- Сервис
- Статус выполнения вызова

Если выбрать второй вариант - "Вызвать Web-сервис", то во вкладке Параметров нужно указать следующие параметры:
- URL web-сервиса
- Метод
- Название
- Параметры метода

Мой SOAP сервис вызывается (из локальной сети) по адресу:
http://[ip_address]/soap?format=pdf
http://[ip_address]/soap?format=jpg
http://[ip_address]/soap?format=xml

Его описание доступно по
http://[ip_address]/soap?wsdl

Текст WSDL во вложении (нужно изменить расширение с txt на xml).

Пример XML-ответа - во вложении (нужно изменить расширение с txt на xml).
Пример PDF-ответа - во вложении.
Пример JPG-ответа - во вложении.

Это была вводная. Сама задача была описана в исходном сообщении темы. Подозреваю, что мне нужно использовать первый вариант ("Вызвать веб-сервис") - у него вроде больше настраиваемых параметров. Теперь вопрос знатокам (или "подсказка зала" - уж как повезет :) :

Кто подскажет, как использовать этот элемент? Если можно - с практическими примерами.

Заранее спасибо!

Показать все комментарии

Коллеги, приветствую.

Пытаюсь аутентифицировать внешние запросы к WCF Web- сервису. Для этого передаю логин и пароль в заголовке SOAP.

using (UsrService client = new UsrService())
{
        client.Credentials = new System.Net.NetworkCredential("Пользователь 1", "Пользователь 1");
        client.SayHello();
}

И Web- сервис и его клиент работают на платформе .NET Framework 4.5.

Запрос не проходит аутентификацию и, насколько я понимаю, происходит редирект на форму логина.

http://localhost:8080/NuiLogin.aspx?ReturnUrl=%2f0%2fServiceModel%2fSimpleCustomService.svc

Что я вижу в своем консольном клиенте:

С чем это может быть связано?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

Нравится

5 комментариев

Если в клиенте я добавляю:

client.AllowAutoRedirect = true;

То в консоли вижу следующее:

Необработанное исключение: System.InvalidOperationException: Клиент обнаружил ти
п содержимого ответа "text/html; charset=utf-8", но ожидается тип "text/xml".
Сбой запроса с сообщением об ошибке:
--
 
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or
g/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="X-UA-Compatible" content="IE=Edge" /><meta http-equiv="C
ontent-Type" content="text/html; charset=utf-8" /><link href="favicon.ico" rel="
shortcut icon" type="image/vnd.microsoft.icon" /><title>
        bpm'online bank customer journey
</title>
        <style>
                .login-label-logo
                {
                        background: url("terrasoft.axd?s=nui-binary-syssetting&r
=Logoimage");
                        background-repeat: no-repeat;
                        width: 223px;
                        height: 100px;
                        margin-bottom: 28px;
                        background-position: left bottom;
                }
        </style>
<script type="text/javascript">
window.workspaceList = {'1': { value: 'Default', displayValue: 'Default' }};
window.supportInfo = [];
window.supportInfoCaption = '';
window.importantLinks = [];
window.importantLinksCaption = '';
window.productVersion = '7.7.0.2872';
window.loginTimeout = '30000';
window.workspaceCount = 1;
var Terrasoft = Terrasoft || {};
window.isNtlmLoginVisible = false;
</script>
<script type="text/javascript" src="http://localhost:8080//core-sl/3218931132877
873a78c92ded6a0b0cf/Terrasoft.Nui"></script>
<script type="text/javascript">
var Terrasoft = Terrasoft || {};
Terrasoft.loaderBaseUrl = 'http://localhost:8080/';
Terrasoft.workspaceBaseUrl = 'http://localhost:8080/';
</script>
<script type="text/javascript">
var FileAPI = {
        staticPath: '../Resources/ui/FileAPI/',
        flashUrl: '../Resources/ui/FileAPI/FileAPI.flash.swf',
        flashImageUrl: '../Resources/ui/FileAPI/FileAPI.flash.image.swf' };
</script>
<script type="text/javascript">
var Terrasoft = Terrasoft || {};Terrasoft.enablePerformanceManager = false;</scr
ipt>
<!--[if IE 8]>
<script type="text/javascript" src="http://localhost:8080//core/b812d8cf89ec068b
5cdda18f2d0de397/normalize/es5shim.js"></script>
<![endif]-->
<script type="text/javascript" src="http://localhost:8080//core/db7fe0930e6258f0
1fb73405039cc9a5/normalize/classList-shim.js"></script>
<script type="text/javascript" src="http://localhost:8080//core/824fc2789913efd8
506c23cfd39496e8/history/history.js"></script>
<script type="text/javascript" src="http://localhost:8080//core/b515858f8b0235cd
de97a34f56882a5b/combined/all-combined.js"></script>
<link rel="stylesheet" type="text/css" href="http://localhost:8080//core/d9868b8
8e2b56f0964c6c0146598e324/combined/all-combined.css" />
<link rel="stylesheet/less" type="text/css" href="http://localhost:8080//core/7e
1adee4ce5c31795a7bb8819c10aeb8/combined/all-combined.less" />
<script type="text/javascript" src="http://localhost:8080//core/48bca5c68f167104
05127cce054f5534/requirejs/require.js"></script>
<script type="text/javascript">
requirejs.config({
paths: {
'core':'http://localhost:8080//core/ef58ab72c648daaa7af074e2526dffc3/Terrasoft/a
md/core',
'bootstrap':'http://localhost:8080//core/022b4acc49ebfbfb33b54d4f95393d2a/Terras
oft/amd/bootstrap',
'performancecountermanager':'http://localhost:8080//core/3bf271e2ad15f056eac25ab
fea30226a/Terrasoft/amd/performancecountermanager',
'loadbootstrap':'http://localhost:8080//core/b0ebbf0e263a02a3db86bf39761aba1c/Te
rrasoft/amd/bootstrap.login',
'jQuery':'http://localhost:8080//core/8d24859b5ac713ab6f05091492b6c631/jQuery/jQ
uery',
'jQuery-easing':'http://localhost:8080//core/a6f75e0c043a2a087837e5c113cc6f7a/jQ
ueryEasing/jQuery-easing',
'jsrender':'http://localhost:8080//core/77f59dfac75bba6c861fe26d75691086/jsrende
r/jsrender',
'ej-common-all':'http://localhost:8080//core/e8b46aebd6473a2f85386c0d072a2b93/Sy
ncfusion/min/ej-common-all',
'ej-diagram':'http://localhost:8080//core/89f5be5f51b070471058224a6550b99a/Syncf
usion/min/ej-diagram',
'process-schema-diagram':'http://localhost:8080//core/650e4ae64a84c1fd11caab7904
39c8ef/Terrasoft/designers/process-schema-designer/process-schema-diagram',
'process-schema-diagram-5x':'http://localhost:8080//core/b0b08b3ec18e7494d488622
07309479f/Terrasoft/designers/process-schema-designer/process-schema-diagram-5x'
,
'ckeditor-base':'http://localhost:8080//core/04628941838af9176121c9cd4332b49d/CK
Editor/ckeditor',
'html2canvas':'http://localhost:8080//core/524ae0cfb507a786266d32d9a16ccc42/html
2canvas/html2canvas'
},
shim: {'jQuery-easing': {'deps': ['jQuery']}, 'ej-common-all': {'deps': ['jQuery
-easing']}, 'ej-diagram': {'deps': ['ej-common-all', 'jsrender']}, 'process-sche
ma-diagram': {'deps': ['ej-diagram']}, 'process-schema-diagram-5x': {'deps': ['p
rocess-schema-diagram']}}});
require(['loadbootstrap'],function() {});
</script>
<script type="text/javascript">
var Terrasoft = Terrasoft || {};
Terrasoft.isDebug = false;
Terrasoft.DataValueTypeRange = {INTEGER: {maxValue:2147483647,minValue:-21474836
48},FLOAT: {maxValue:79228162514264337593543950335,minValue:-7922816251426433759
3543950335},DATE_TIME: {maxValue:"0001-01-01T00:00:00.000",minValue:"0001-01-01T
00:00:00.000"}};
Terrasoft.storesConfig = [];
Terrasoft.storesConfig.push({levelName: 'ClientPageSession', type: 'Terrasoft.Me
moryStore', isCache: true});Terrasoft.storesConfig.push({levelName: 'Domain', ty
pe: 'Terrasoft.LocalStore', isCache: true});
if(Terrasoft.StoreManager){
        Terrasoft.StoreManager.registerStores(Terrasoft.storesConfig);
}
 
</script>
</head>
<body>
        <form name="IndexForm" method="post" action="./NuiLogin.aspx?ReturnUrl=%
2f0%2fServiceModel%2fSimpleCustomService.svc%2fsoap" id="IndexForm">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="Ael0TejuuQ2cn+6a
KrS5wJo2ATMwUDq1DBRh5WGdOqpW+NOyOwBLY85L9xsvJnX+0sZlKI3bZN5Qk7o0okrcDBSteeTArKGx
leRg/1ydqd/XMABb" />
</div>
 
<div>
 
        <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATO
R" value="F2DA7F48" />
</div>
        </form>
</body>
</html>
 
--.
   в System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClien
tMessage message, WebResponse response, Stream responseStream, Boolean asyncCall
)
   в System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodNa
me, Object[] parameters)
   в UsrService.SayHello() в c:\VS2015\Projects\WCFSharedDLL\WCFSharedDLL\TestPr
oxyClass.cs:строка 44
   в ConsoleApplicationForTesting.Program.Main(String[] args) в c:\VS2015\Projec
ts\ConsoleApplicationForTesting\ConsoleApplicationForTesting\Program.cs:строка 1
6
Для продолжения нажмите любую клавишу . . 

Т.е. исходный код страницы авторизации.

Решил таким образом. На уровне транспортного протокола передал учетные данные:

public const string authServiceUri = 
	"http://localhost:8080/ServiceModel/AuthService.svc/Login";
public static CookieContainer AuthCookie = 
	new CookieContainer();
 
public static bool TryLogin(string userName, string userPassword)
{
    var authRequest = HttpWebRequest.Create(authServiceUri) 
		as HttpWebRequest;
 
    authRequest.Method = "POST";
    authRequest.ContentType = "application/json";
    authRequest.CookieContainer = AuthCookie;
 
    using (var requesrStream = authRequest.GetRequestStream())
    {
        using(var writer = new StreamWriter(requesrStream))
        {
            writer.Write(@"{
                ""UserName"":""" + userName + @""",
                ""UserPassword"":""" + userPassword + @"""
            }");
        }
    }
 
    using(var response = (HttpWebResponse)authRequest.GetResponse())
    {
        if (AuthCookie.Count > 0)
        {
            return true;
        }
    }
    return false;
}

Установил CookieContainer:

client.CookieContainer = AuthCookie;

Стало возможным выполнять запросы к Web- сервису:

static void Main(string[] args)
{
	using (UsrService client = new UsrService())
	{
		if(TryLogin("Пользователь 1", "Пользователь 1"))
		{
			client.CookieContainer = AuthCookie;
			Console.WriteLine(client.SayHello());
		}
	}
}

Хотя и осталось непонятным, почему не удалось аутентифицировать внешние запросы через передачу учетных данных в SOAP заголовке...

Здравствуйте.
Как вариант, в заголовок запроса можно было попробовать указать content-type "text/xml".

Здравствуйте, Александр. Хорошо, спасибо - попробую и отпишусь, что вышло.

Показать все комментарии

Коллеги, приветствую.

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

Контракт:

 

namespace SimpleCustomService
{
    [ServiceContract]
    public interface UsrIService
    {
        [OperationContract]
        string SayHello(string value);
    }
}

 

Реализация:

 

namespace SimpleCustomService
{
    public class UsrService : UsrIService
    {
        public string SayHello(string value)
        {
            return "Hello" + value;
        }
    }
}

 

В браузере я могу обратиться к WSDL:

 

http://localhost:8080/0/ServiceModel/SimpleCustomService.svc?wsdl

 

Или так:

 

http://localhost:8080/0/ServiceModel/SimpleCustomService.svc?singleWsdl

 

Но когда я пытаюсь добавить ссылку в проект MS Visual Studio, получаю ошибку:

По ссылке Details следующее:

 

The HTML document does not contain Web service discovery information.
Metadata contains a reference that cannot be resolved: 'http://localhost:8080/0/ServiceModel/SimpleCustomService.svc?wsdl'.
The content type text/html; charset=utf-8 of the response message does not match the content type of the binding (application/soap+xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 1024 bytes of the response were: '



xmlns="http://www.w3.org/1999/xhtml">
>http-equiv="X-UA-Compatible" content="IE=Edge" />http-equiv="Content-Type" content="text/html; charset=utf-8" />href="favicon.ico" rel="shortcut icon" type="image/vnd.microsoft.icon" />>
    bpm'online bank customer journey
>

   
        .login-label-logo
        {
            background: url("terrasoft.axd?s=nui-binary-syssetting&r=Logoimage");
            background-repeat: no-repeat;
            width: 223px;
            height: 100px;
            margin-bottom: 28px;
            background-position: left bottom;
        }
    >
="text/javascript">
window.workspaceList = {'1': { value: 'Default', displayValue: 'Default' }};
window.supportInfo = [];
window.supportInfoCaption = '';
window.importantLinks = [];
window.importantLinksCaption = '';
window.productVersion = '7.7.0.2872';
window.loginTimeout = '30000';
window.workspaceC'.

If the service is defined in the current solution, try building the solution and adding the service reference again.

Настройки в behaviors.config:

>
    >
        name="RestServiceBehavior">
            helpEnabled="true" />
        >
    >
    >

        >

            />
            />
            />
            httpGetEnabled="true" />
            includeExceptionDetailInFaults="true" />
        >
        name="BaseServiceBehavior">
            />
            />
            />
            includeExceptionDetailInFaults="true" />
            httpGetEnabled="true" />
           
               maxConcurrentCalls="1000"
               maxConcurrentInstances="1000"
               maxConcurrentSessions="1000" />
        >
        name="RestServiceBehavior">
            />
            />
            />
            httpGetEnabled="true" />
            includeExceptionDetailInFaults="true"  />
        >
    >
>

Настройки в services.config:

behaviorConfiguration="BaseServiceBehavior" name="SimpleCustomService.UsrService">
    name="UsrServiceEndPoint"
           binding="webHttpBinding"
           behaviorConfiguration="RestServiceBehavior"
           bindingNamespace="http://Terrasoft.WebApp.ServiceModel"
           contract="SimpleCustomService.UsrIService" />
    address="soap" binding="basicHttpBinding" contract="SimpleCustomService.UsrIService"/>
    address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
>

Что может вызывать такую ошибку?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

Нравится

2 комментария

Собственно, есть альтернативный ход - сохранить wsdl локально и использовать утилиту wsdl.exe.. Все же хотелось бы понять, почему не удается добавить ссылку - был бы весьма признателен, если бы кто- нибудь поделился знаниями.

Если кликнуть по "Advanced" и затем вписать в URL ссылку на wsdl, то в поле "Web services found at this URL" всегда "The HTML document does not contain Web service discovery information.", а Web reference name и Add reference всегда disabled.

Добрый день, Алексей!

В svc файле должна быть объявлена Factory. Пример ниже.

<%@ ServiceHost Language="C#" Debug="true" Factory="System.ServiceModel.Activation.WebServiceHostFactory" Service="Terrasoft.WebApp.Loader.ServiceModel.AuthService" %>

Показать все комментарии

Коллеги, приветствую.

Существует- ли возможность интеграции bpm'online с внешним приложением по протоколу SOAP?
Например, в bpm'online я создаю некий Web- сервис, который читает из базы данных, далее по его WSDL создаю автономного клиента (консоль) и по RPC вызываю методы Web- сервиса bpm'online.. Такое возможно?

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением Алексей Быков.

Нравится

3 комментария

Возможно, для этих целей подойдет WCF Web- сервис? Разместить его в IIS, получить WSDL... дальше сгенерировать клиентские артефакты... и все.. или я не прав?

Добрый день!
Посмотрите пост https://community.terrasoft.ru/node/16393#comment-62259

Отлично, спасибо!

Показать все комментарии

Добрый день уважаемые коллеги!

Приглашаю Вас посетить вторую часть тренинга по технологии Windows Communication Foundation, который состоится в субботу 13 августа.

В начале тренинга мы вспомним основные моменты, о которых подробно рассказывалось в первой части тренинга.

Вспомним принципы SOA архитектуры. Напомним, из каких частей состоит типовой WCF сервис. Каких типов бывают контракты. Чем отличается контракт данных от контракта сообщения. Что такое конечная точка. Какие бывают привязки и за что они отвечают помимо выбора протокола передачи сообщений. Что такое поведение сервиса и чем оно отличается от поведения конечной точки. Что такое жизненный цикл экземпляра сервиса и как им управлять.

После, вместе попробуем создать сервис, который даст нам ответы на все, выше поставленные вопросы.

Ну и что бы мозг не взорвался и смог переварить всю полученную информацию, сделаем маленький перерыв. Во время которого можно будет выпить чашку чая/кофе с печеньем или пирожными.

Во второй половине нашей встречи мы начнем углубляться в дебри технологии и посмотрим, каким образом можно вмешаться в механизмы WCF. Узнаем, как реализовать логирование исключений сервиса(даже тех исходников которых у нас нет) на уровне всего приложения. Как изменить тип исключения перед отправкой клиенту. Каким образом кэшировать результат работы длительных операций. Как сделать валидацию входящих параметров, и при этом не меняя код внутри методов.

Поговорим о новых фичах появившихся с выходом WCF 4.0. Рассмотрим возможности Routing-a. Как его использовать, что бы пользователь думал, что он работает с одним сервисом, который содержит 20 методов, а не с 4мя сервисам по 5 методов (как на самом деле). Как routing может помочь с реализацией отказоустойчивой системы. Какие требования предоставляются к сервису для расширяемости.

Второй перерыв на кофе будет тоже не лишним.

После кофе вы уже будете убеждены, что WCF сервисы позволяют строить большие, отказоустойчивые, расширяемые распределенные системы. Но при этом подходов к построению WCF сервисов как минимум два – SOAP и REST.

Мы постоянно общались в рамках SOAP подхода. В заключительной части встречи, я хочу поговорить о втором подходе – REST. Мы узнаем, чем эти два подхода отличаются. Обсудим достоинства и недостатки каждого из них. Посмотрим как реализовать REST сервис. Покажу, каким образом оба подхода могут уживаться в одном сервисе. Также рассмотрим технологию WCF Data Services (ранее ADO.NET Data Services), которая основана на REST подходе, позволяющую легко реализовать протокол OData.


Резюме

  • Если вы пропустили первую часть тренинга, ничего страшного мы почти все повторим :)
  • Вторая часть будет просто переполнена примерами кода и практическими заданиями, так что если есть ноутбук (c VisualStudio 2010 и NET 4.0) лучше взять с собой, т.к. по опыту прошлого тренинга машин на всех может не хватить.
  • Будет два перерыва для чая, кофе, печенюшек и общения :)

Основные темы тренинга: Основы WCF (бегло по первой части); Авторизация; Custom behaviors; Routing, Protocol Bridging; SOAP vs REST; WCF Data Services (OData)

Нравится

Поделиться

4 комментария

Только для программистов? Интересно, но боюсь, что человеку, довольно поверхностно знакомому с программированием, данный материал будет не понятен.

"Симоненко Влад" написал:Только для программистов? Интересно, но боюсь, что человеку, довольно поверхностно знакомому с программированием, данный материал будет не понятен.

Для понимания материала необходимы базовые знания ООП и языка С#. Также будет крайне полезно уметь работать в Visual Studio.

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

"Венжик Игорь" написал:
#2 Венжик Игорь 4 августа 2011 – 14:15
Симоненко Влад пишет:
Только для программистов? Интересно, но боюсь, что человеку, довольно поверхностно знакомому с программированием, данный материал будет не понятен.
Для понимания материала необходимы базовые знания ООП и языка С#. Также будет крайне полезно уметь работать в Visual Studio.

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


Как деликатно положительно ответил на вопрос :)

Список полезных ссылок для освоения технологии:

Основные положения системы обмена сообщениями WCF

Источник http://msdn.microsoft.com/ru-ru/magazine/cc163447.aspx#S6

Introducing Windows Communication Foundation in .NET Framework 4

Источник http://msdn.microsoft.com/en-us/library/ee958158.aspx

Подробные сведения о возможностях WCF

Источник http://msdn.microsoft.com/ru-ru/library/ms733103.aspx

Announcement and discovery in WCF 4

Источник http://www.freddes.se/2010/05/16/announcement-and-discovery-in-wcf-4/

RESTful Web services: The basics

Источник https://www.ibm.com/developerworks/webservices/library/ws-restful/

What's New in Windows Communication Foundation

Источник http://msdn.microsoft.com/en-us/library/dd456789.aspx

WCF Feature Details

Источник http://msdn.microsoft.com/en-us/library/ms733103.aspx

Oбщие сведения о службах WCF Data Services

Источник http://msdn.microsoft.com/ru-ru/library/cc668794.aspx

Перехватчики (службы WCF Data Services)

Источник http://msdn.microsoft.com/ru-ru/library/dd744842.aspx

Показать все комментарии

Добрый день.
Я новичок в работе с системой Terrasoft CRM.
Имеем ПО с API.
Необходимо интегрировать Terrasoft CRM и синхронизировать информацию посредством API через SOAP (WSDL).
Есть ли какие-либо готовые решения или примеры? Где можно найти документацию по внедрению подобного плана.

Нравится

2 комментария

Вот тут пример работы с soap из яваскрипта:
http://www.gotdotnet.ru/forums/12/105100/

Аналогичный код работает из террасофта.

Используйте стандартные методы работы с soap для java script.

Показать все комментарии

Как через веб-сервисы выполнять SQL_запросы на базе данных?

В WDSL есть метод ExecuteSQL, он принимает параметр APackage
Нигде в документации ничего про это не нашел. Не нашел так же никаких примеров кода.

Как выполнить SQL-запрос к данным базы через веб-сервисы?

Нравится

7 комментариев

Тут многое зависит от версии системы.
В своем блоге я показал пример вызова сервисов под 3.3.0.
APackage это не сам запрос, а вся команда к SQL серверу с параметрами, сохраненная определенным образом сначала в xml, потом в Base64(Mime) и, в зависимости от параметров соединения, возможно зазипованая.
Плюс возможна пакетная передача данных, если запросы большие.

Прикрепляю пример работы с последней версией Web-сервисов Terrasoft на C#

хм.... на 3.3.0 и 3.3.2 не работает:

	string LoginInfoXml = Enc.GetString(Convert.FromBase64String(LoginInfoStr));
	XmlDocument XmlDoc = new XmlDocument();
	XmlDoc.LoadXml(LoginInfoXml);
	XmlNode node = XmlDoc.FirstChild;

неправильно раскодирует. Надо будет попробовать на более поздних версиях...

Нет, Саня, на 3.3.2.119 не работает.
Возвращает респонз, который начинается всегда для всех запросов с символов "eAEB".
Это какие-то управляющие спецсимволы, если их перевести в нормальную кодировку.
На ранних версиях у меня этого нет. Т.к. это не стандартная кодировка - пример, что выложен тоже не работает.
Convert.FromBase64String(LoginInfoStr) - не правильно разкодирует то что пришло с сервера.
Кстати, под 4-м фреймворком вообще вебсервисы не работают, только под 2-м.

Возможно, эта задача и не приоритетная - решать вам. Я просто констатирую факты.

Спасибо, Андрей. Постараюсь предоставить более актуальный пример. Также выясню насчет Framework 4.0

Сегодня добрался до тестирования проблемы с выполнением ExecuteSQL через веб-сервисы.

Так вот, выяснил, что управляющие символы в начале -- это начало архива (сжатие результатов в zip-архив). Поэтому Convert.FromBase64String возвращал не то что хотелось, т.к. нужно делать "разархивацию".

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

rqOpenConfiguration.ACompressionLevel = 0; //Without compression (zip)     

Эта доработка появилась начиная с версии 3.3.2.123.

И насчет версии Framework'а. На 4-том все замечательно работает, так же как и на 2-ом. В качестве теста использовал:

  • Windows 7 Enterprise х64
  • IIS 7.5
Показать все комментарии

В wdsl описано:
OpenConfiguration(string AConfigurationName, string AUserName, string AUserPassword, int ACompressionLevel, string ASessionUID, string ADBExecutorTypeCode)

Вопрос:

ADBExecutorTypeCode - какие значения принимает?

Нравится

2 комментария

Подозреваю, такие же, как указаны в CoreSettings.xml в блоке DBExecutorTypes:

	<DBExecutorTypes>
		<Item Code="MSSQL" .../>
		<Item Code="Oracle" .../>
		<Item Code="Firebird" .../>
		<Item Code="WebServices" .../>
	</DBExecutorTypes>

ASessionUID и ADBExecutorTypeCode исходящие параметры. Их заполнять не нужно.

Показать все комментарии