Коллеги, требуется помощь.

Добавляю в VisualStudio2017 ссылку на сервис /0/ServiceModel/EntityDataService.svc/,ввожу логин и пароль, нажимаю далее - и высвечивается ошибка (рис 0001.1 и 0001). В сообщении выдаётся ссылка на документацию http://odata.github.io/odata.net/#OData-Client-Code-Generation-Tool

Если вводить адрес сервера в строку браузера - то после авторизации отврывается нормальный xml (рис. 0003)

Как поправить ошибку?

Заранее благодарен.

Прикрепленные файлы

Нравится

1 комментарий

Есть инструкция по созданию прокси-классов, проверьте, может, что-то упустили.

Также, если есть доступ к бинарникам сайта, вместо EntityDataService из своей программы можно работать посредством DataService, как описано тут.

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

Добрый день!

Подскажите, как корректно добавить блок behaviorExtensions в конфиг системы.

Добавил блок 

<behavior>

<log4net />

</behavior><br />
<br />
И в блоке RestServiceBehavior добавил log4net




<behavior name="RestServiceBehavior"><br />
            <errorHandler/><br />
            <matchAllMessage/>

            <log4net

/><br />
            <threadContextInitializer/><br />
            <serviceMetadata httpGetEnabled="true" /><br />
            <serviceDebug includeExceptionDetailInFaults="true"  /><br />
        </behavior>

в файл behaviours.config



В Web.config в Terrasoft.WebApp.

<extensions>

<behaviorExtensions>

<add name="log4net"

type="Integration.Log4NetBehaviorExtensionElement, Integration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />

</behaviorExtensions>

</extensions>



Класс Log4NetBehaviorExtensionElement также определил в Integration.



После чего возникают ошибки при попытке залогиниться в систему с сервисом. Подскажите как корректно настроить конфиги.

Нравится

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

Добрый день.

<behaviorExtensions> нужно прописывать в Extensions.config (там же написаны некоторые рекомендации). Ваш класс должен наследоваться от абстрактного класса «BehaviorExtensionElement» (namespace System.ServiceModel.Configuration). Проверьте ваш класс на доступность в БП или сервисе пред его записью в behaviorExtensions.

VladKapitanchyk,

 

Влад, добрый день!

Подскажите, пожалуйста, что значит:

<!-- Значения атрибутов type изменяются при автосборке. При добавлении/удалении/изменении содержимого оповестить ответственного за автосборку! -->

Каким образом необходимо уведомить ответственного за автосборку?

Тетиков Дмитрий Владимирович,

Добрый день.

На этот комментарий можете не обращать внимание, это относится к старой логике. Посмотрите на версию вашего extension, там указывается версия сборки, возьмите такую же, как и в предыдущих extensions.

VladKapitanchyk, 

Влад, сделал согласно рекомендациям. Первоначально была ошибка 

Exception Message: Не удалось загрузить тип "ArdsinBankCode.Integration.Log4NetBehaviorExtensionElement, ArdsinBankCode.Integration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", зарегистрированный для расширения "log4net". (D:\TSroot\ArdshinBank7102-2\Terrasoft.WebApp\ServiceModel\http\behaviors.config line 29)

Exception Type: System.Configuration.ConfigurationErrorsException

Exception Source: System.Configuration в логах Application.



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

Класс при вызове из БП доступен.

Подскажите, какие еще могут быть нюансы, пожалуйста.

&lt;extensions&gt;
  &lt;behaviorExtensions&gt;
    &lt;!-- Делать разрывы строк внутри атрибута type запрещено! --&gt;
    &lt;!-- Значения атрибутов type изменяются при автосборке. При добавлении/удалении/изменении содержимого оповестить ответственного за автосборку! --&gt;
    &lt;add name="errorHandler" type="Terrasoft.Web.Common.ServiceModel.ErrorHandlerElement, Terrasoft.Web.Common, Version=7.10.2.1416, Culture=neutral, PublicKeyToken=edaadfbc3b0bb879" /&gt;
    &lt;add name="matchAllMessage" type="Terrasoft.Web.Common.ServiceModel.MatchAllMessageElement, Terrasoft.Web.Common, Version=7.10.2.1416, Culture=neutral, PublicKeyToken=edaadfbc3b0bb879" /&gt;
    &lt;add name="threadContextInitializer" type="Terrasoft.Web.Common.ServiceModel.ThreadContextInitializerElement, Terrasoft.Web.Common, Version=7.10.2.1416, Culture=neutral, PublicKeyToken=edaadfbc3b0bb879" /&gt;
	&lt;add name="log4net" type="ArdsinBankCode.Integration.Log4NetBehaviorExtensionElement, ArdsinBankCode.Integration, Version=7.10.2.1416, Culture=neutral, PublicKeyToken=edaadfbc3b0bb879" /&gt;
  &lt;/behaviorExtensions&gt;
&lt;/extensions&gt;
 
&lt;behavior name="RestServiceBehavior"&gt;
			&lt;errorHandler/&gt;
			&lt;matchAllMessage/&gt;
			&lt;log4net/&gt;
			&lt;threadContextInitializer/&gt;
			&lt;serviceMetadata httpGetEnabled="true" /&gt;
			&lt;serviceDebug includeExceptionDetailInFaults="true"  /&gt;
		&lt;/behavior&gt;

 

Попробуйте выполнить следующее:

1) Проверить логи windows на сервере, там должна быть более детальная информация об ошибке (это будет либо error, либо warning)

2) Если после выполнения первого пункта ситуация не прояснится, можно настроить трассировку wcf сервисов

https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/tracing-a…

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

Добрый день!

Реализовал простейший Wcf сервис в BPM Online. Прописал все конфиги, по ссылке стало доступно описание сервиса http://localhost:89/0/ServiceModel/NewWebService.svc.



Создал консольное клиентское приложение, привожу код ниже. Получаю данные авторизации CookieContainer согласно примеру на академии. А вот дальше в ответ на запрос получаю ошибку: Удаленный сервер возвратил ошибку:403 запрещено. При этом аналогичный сервис размещенный в IIS работает корректно. Подскажите, как можно решить проблему.

Console.WriteLine("Успешна ли аутентификация?: {0}", TryLogin("Supervisor", "Supervisor"));

                string uri = "http://localhost:89/0/ServiceModel/NewWebService.svc/getCurrencyList";

                var currencyRequest = new NewWebService.request();

                currencyRequest.Id = "22";

                currencyRequest.operation = "getCurrencyList";

                currencyRequest.getCurrencyListParameters = new List();

                XmlSerializer serializer = new XmlSerializer(typeof(NewWebService.request));



                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

                request.CookieContainer = AuthCookie;

                //request.KeepAlive = true;

                request.Method = "POST";

                request.ContentType = "text/xml";

                using (Stream requestStream = request.GetRequestStream())

                {

                    serializer.Serialize(requestStream, currencyRequest);

                }

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                using (Stream responseStream = response.GetResponseStream())

                {

                    var responseStr = new StreamReader(responseStream).ReadToEnd();

                    responseStr = HttpUtility.HtmlDecode(responseStr);

                    XmlSerializer deserializer = new XmlSerializer(typeof(CurrencyServiceResponse.Response));

                    using (TextReader reader = new StringReader(responseStr))

                    {

                        var responseObj = (CurrencyServiceResponse.Response)deserializer.Deserialize(reader);

                    }

                }               

                response.Close();

Нравится

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

Добрый день, Дмитрий!

Система может возвращать 403 на POST запросы в случае есть в Web.config включен UseCsrfToken

 &lt;add key="UseCsrfToken" value="true" /&gt;

Тогда хедер http запроса должен выглядеть следующим образом:

Если это локальная разработка, и нет необходимости в csrf-защите, то можно отключить UseCsrfToken. (https://academy.terrasoft.ru/documents/technic-sdk/7-11/zashchita-ot-cs…)

Добрый день! Отключил в конфиге UseCsrfToken и теперь по ссылке http://localhost:89/0/ServiceModel/NewWebService.svc в браузере отображается ошибка: Сайт localhost выполнил переадресацию слишком много раз. Вернул конфиг на исходное значение, ошибка сохранилась.

Теперь сервис вновь доступен, запрос из клиента возвращает 400. Csfr отключен.



При запросе из fiddler вовращает 302.

a6

<html><head><title>Object moved</title></head><body>

<h2>Object moved to <a href="/0/ServiceModel/NewWebService.svc/getCurrencyList">here</a>.</h2>

</body></html>

 

 

Ошибка 400 - это Bad Request. У вас что-то не так с вызовом. Без описания сервиса и его метода сложно судить. Попробуйте создать отдельно WCF Service Application с вашим сервисом и потестируйте на нем

Через WCF Service Application развернутый в IIS работает. Описание сервиса и методов ниже.

//[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

public class NewWebService : INewWebService

    {

        public ResponseData Auth(RequestData RequestData)

        {

            var data = RequestData.details.Split('|');

            var response = new ResponseData

            {

                Name = data[0],

                Age = data[1],

                Exp = data[2],

                Technology = data[3]

            };

            return response;

        }

        public response GetCurrencyList()

        {

            var resp = new response();

            resp.value = "<getCurrencyList><CurrencyList><externalId>EUR</externalId><isoCode>978</isoCode><isoTxt>EUR</isoTxt><cb>571.25</cb><sell>580</sell><buy>568</buy><CshSell>580</CshSell><CshBuy>568</CshBuy><CshBuyTrf>568.5</CshBuyTrf><name><translation lang=\"ru\" value=\"ЕВРО\" /><translation lang=\"en\" value=\"\" /><translation lang=\"am\" value=\"ԵՎՐՈ\" /></name><country /></CurrencyList><CurrencyList><externalId>RUR</externalId><isoCode>643</isoCode><isoTxt>RUR</isoTxt><cb>8.31</cb><sell>8.4</sell><buy>8.18</buy><CshSell>8.4</CshSell><CshBuy>8.18</CshBuy><CshBuyTrf>8.23</CshBuyTrf><name><translation lang=\"ru\" value=\"Российский рубль\" /><translation lang=\"en\" value=\"Russian ruble\" /><translation lang=\"am\" value=\"Ռուսական ռուբլի\" /></name><country>RUS</country></CurrencyList><CurrencyList><externalId>USD</externalId><isoCode>840</isoCode><isoTxt>USD</isoTxt><cb>478.39</cb><sell>480</sell><buy>477</buy><CshSell>480</CshSell><CshBuy>477</CshBuy><CshBuyTrf>477.5</CshBuyTrf><name><translation lang=\"ru\" value=\"Доллар США\" /><translation lang=\"en\" value=\"US dollar\" /><translation lang=\"am\" value=\"ԱՄՆ դոլար\" /></name><country>USA</country></CurrencyList><errorCode>0</errorCode></getCurrencyList>";

            return resp;

        }

    }

    [ServiceContract]

    [XmlSerializerFormat]

    public interface INewWebService

    {

        [OperationContract]

        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "auth")]

        ResponseData Auth(RequestData rData);

        [OperationContract]

        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "getCurrencyList")]

        response GetCurrencyList();

    }

}

Артем Гура,

Плюс при переходе в браузере по ссылке на сервис размещенный в IIS открывается страница Запрещенный метод, а на сервис размещенный в BpmOnline Http Error 400.

Тетиков Дмитрий Владимирович,

Разница между сервисом в IIS и в bpmonline в том что bpmonline необходимо пройти авторизацию и отправлять дополнительные токены и куки в хедере запроса.

Тут можно посмотреть примеры отправки запросов из Fiddler: https://academy.terrasoft.ua/documents/technic-sdk/7-11/vypolnenie-zapr…;

По аналогии вы можете отправлять запросы на NewWebService.svc

Еще раз хочу обратить внимание на хедер запроса: 

 

Проблема была в неверном конфиге. 

<service behaviorConfiguration="BaseServiceBehavior" name="CurrencyService.NewWebService">

При объявлении сервиса в аттрибуте name прописал название интерфейса, а не класса - сервиса.

Спасибо за рекомендации, теперь все работает корректно.

Tsopa,

В продолжение темы, подскажите пожалуйста, как сформировать запрос с Basic авторизацией. 

Отправляю в таком виде:

POST http://localhost:89/0/ServiceModel/NewWebService.svc/auth HTTP/1.1

Accept: text/xml

Content-Type: text/xml

Authorization: Basic U3VwZXJ2aXNvcjpTdXBlcnZpc29y 

Host: localhost:89

Content-Length: 191

<?xml version="1.0"?>

<RequestData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <details>Ivan|29|3years|C#</details>

</RequestData>



Получаю вот такой ответ:

 

HTTP/1.1 302 Found

Cache-Control: private

Transfer-Encoding: chunked

Content-Type: text/html; charset=utf-8

Location: /0/ServiceModel/NewWebService.svc/auth

Server: Microsoft-IIS/10.0

X-AspNet-Version: 4.0.30319

Set-Cookie: BPMSESSIONID=j22z5jiyd4njspgjq0tc32d0; path=/0; HttpOnly

Set-Cookie: .ASPXAUTH=; expires=Mon, 11-Oct-1999 19:00:00 GMT; path=/; HttpOnly

X-Powered-By: ASP.NET

X-Frame-Options: SAMEORIGIN

Date: Tue, 30 Jan 2018 09:06:22 GMT

9b

<html><head><title>Object moved</title></head><body>

<h2>Object moved to <a href="/0/ServiceModel/NewWebService.svc/auth">here</a>.</h2>

</body></html>

0

 

Тетиков Дмитрий Владимирович,

Используя Basic аутентификацию можно обратиться только к EntityDataservice.svc. Для всех остальных внешних запросов рекомендуется использовать AuthService.svc и соответствующие Cookie.

Больше информации можно получить тут: https://academy.terrasoft.ru/documents/technic-sdk/7-11/autentifikaciya…

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

Добрый день!
Пытаюсь выполнить post запрос из консольного приложения к методу из wcf сервиса. GET запросы проходят без проблем. Но с POST запросами возникли проблемы. Возвращается ошибка " Удаленный сервер возвратил ошибку: (401) Несанкционированный.". Авторизацию прохожу как в документации https://academy.terrasoft.ru/documents/technic-sdk/7-9/autentifikaciya-v.... Тестовый сервис:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
        public class UsrTestService
        {
            [OperationContract]
            [WebInvoke(Method = "POST",
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json)]
                public string TestMethod()
                {
                        return "test";

                }
}

Пытаюсь обратится к методу TestMethod:
"http://myserver.com/0/rest/UsrTestService/TestMethod"
При этом, если вызывать метод из интерфейса bpm - все работает. Можете подсказать что могло пойти не так, возможно, я какие то настройки не выполнила?

Нравится

1 комментарий

Разобралась.

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

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

Пытаюсь аутентифицировать внешние запросы к 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" /><span style="color: #000000; font-weight: bold;">>
    bpm'online bank customer journey
>

   

Нравится

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" %>

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

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

Собственно вопрос - как разрешить удаленный вызов процедур Web- сервиса? Есть простой WCF Web- сервис, на его основе получен WSDL, из которого сгенерированы прокси- классы. Эти прокси- классы использует простой консольный клиент, например, просто вернуть строку с сервера - вылетает окно:

Судя по ссылке, запрос не проходит авторизацию, хотя в Terrasoft.WebApp\Web.config указано, что:

 
   
     
       
     

   
 

Как отключить авторизацию для RPC?

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

Спасибо.

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

Нравится

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

Переехали решать задачу в рамках технической поддержки:smile:

Здравствуйте, Алексей! Спасибо! :smile:

Вот некоторые подробности.

1. В \Terrasoft.WebApp\ServiceModel добавил UsrService.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="Terrasoft.WebApp.ServiceModel.UsrService" CodeBehind="UsrService.svc.cs" %>

2. В \Terrasoft.WebApp\Web.config добавил:

  <appSettings>
    ...
    <add key="AllowedLocations" value="...;ServiceModel/UsrService.svc"/>
   ...
  </appSettings>
 
  ...
 
  <location path="ServiceModel/UsrService.svc">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
   ...

Контракт Web- сервиса в конфигурации (UsrIService.svc):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
 
namespace SimpleCustomService
{
    [ServiceContract]
    public interface UsrIService
    {
        [OperationContract]
        string SPMClientInfo();
    }
}

Реализация Web- сервиса в конфигурации (UsrService.svc):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
 
namespace SimpleCustomService
{
    public class UsrService : UsrIService
    {
        public string SPMClientInfo()
        {
            return "test string";
        }
    }
}

В \Terrasoft.WebApp\ServiceModel\http\services.config добавил:

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

Нашел вот статью, попробую сделать как там описано. Аутентификация внешних запросов к веб-сервисам bpm'online

Отличная статья, как я теперь могу вызвать метод Web- сервиса, используя AuthCookie? Должен- ли я менять код Web- сервиса, чтобы аутентифицировать внешние запросы?

Здравствуйте.
Обратите внимание на ресурс: http://stackoverflow.com/questions/16028014/how-can-i-pass-a-username-p…

Здравствуйте, Александр! Спасибо большое за ответ, попробую сделать так.

Возвращаясь к началу, хочу отметить одну интересную деталь - если в Visual Studio попытаться добавить ссылку на WSDL (Add Web Reference), то получим такое вот окно:

URL тот же самый, что и в консоли:

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

Здравствуйте, Алексей!

Даже если сделать так?

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

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

Есть некоторый конфигурационный Web- сервис, размещенный в пакете Custom.

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

Как получить доступ к WSDL моего сервиса?

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

Спасибо.

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

Нравится

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

Или же SOAP Web- сервисы и клиенты полностью разрабатываются в MS Visual Studio, а затем код Web- сервиса переносится (копируется) в конфигурационный?

Добрый день.
WSDL можно получить, например, так:
https://my_site/0/ServiceModel/my_web_service.svc?wsdl

Здравствуйте, Артем! Спасибо. Про параметр wsdl я знаю.. Не могли бы Вы проконсультировать
относительно пути до Web- сервиса -

ttps://my_site/0/ServiceModel/my_web_service.svc?wsdl

my_site - ? (в принципе, понятно...)
ServiceModel - ?

Требуется- ли какая- либо дополнительная настройка?

Ой, сорри, немного ошибся. Это не совсем конфигурационные web-сервисы.

Путь складывается так:
https://имя_сайта/0/rest/имя_сервиса
(это можно увидеть в модуле ServiceHelper)

Далее, что касается wsdl. По конфигурационным сервисам не получится получить wsdl. С ними нужно работать как с REST - простимы Post/Get запросами

При таких запросах:

http://localhost:8080/WebApp/0/ServiceModel/PaymentsRegisterService.svc?wsdl
http://localhost:8080/0/ServiceModel/PaymentsRegisterService.svc?wsdl

Такая ошибка:

Date: 14.04.2016 16:07:28
Date (UTC): 14.04.2016 12:07:28
 
Exception Message: The service '/WebApp/0/ServiceModel/PaymentsRegisterService.svc' does not exist.
Exception Type: System.ServiceModel.EndpointNotFoundException
Exception Source: System.ServiceModel.Activation
 
Exception Stack Trace:
   at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath, EventTraceActivity eventTraceActivity)
   at System.ServiceModel.ServiceHostingEnvironment.EnsureServiceAvailableFast(String relativeVirtualPath, EventTraceActivity eventTraceActivity)
   at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.HandleRequest()
   at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest()
 
SessionID: k1zrorhl53nfgmtswhcohchx
Request URL: /WebApp/0/ServiceModel/PaymentsRegisterService.svc?wsdl
Request Path: /WebApp/0/ServiceModel/PaymentsRegisterService.svc
Request Type: GET
User Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
User Host Address: ::1
User: Пользователь 1
Is Authenticated: True
Authentication Type: Forms
Is Secure Connection: False
 
Application Version: 7.7.0.2872
Application Path: C:\terrasoft\BankCustomerJourney770_Demo\
Application Virtual Path: /
Application Trust Level: Full
Machine Name: ALEKSEYBYKOV-PC
Is Local: True
 
Process ID: 17564
Process Name: iisexpress.exe
Process Account Name: AlekseyBykov-PC\Aleksey-Bykov
Thread Account Name: AlekseyBykov-PC\Aleksey-Bykov
OS Version: Microsoft Windows NT 6.1.7601 Service Pack 1
Net Framework Version: 4.0.30319.42000
DBExecutor Type: MSSqlExecutor

Артем, спасибо большое за ответ.
Так... а что же делать? Есть- ли возможность разработки SOAP Web- сервисов? Если я хочу (нужно) из внешнего приложения обращаться к Web- сервису bpmonline, генерируя по его WSDL прокси- классы?..

К вопросу об интеграции..

https://www.terrasoft.ru/products/bpmonline/integration

Web-сервисы
Интеграция приложений bpm’online с другими системами посредством web-сервисов позволяет существенно упростить процесс и значительно сократить время синхронизации данных.

Поддержка открытых стандартов (SOAP, WSDL) и широкая сфера применения web-сервисов позволяет связывать в единую информационную среду бизнес-приложения и системы, созданные на базе различных технологий.

Платформа bpm’online позволяет запрашивать данные из сторонних систем для передачи в bpm’online , равно как и вызывать собственные web-сервисы для получения данных из bpm’online.

Вполне вероятно, что мне подойдет WCF Web- сервис. DLL можно разместить в IIS и получить WSDL.

Добрый день!
Собственно то, о чем я говорил в самом первом ответе :), но для этого нужно дополнительные настройки (только если у Вас on-site)

В конфигурации создаем схему исходного кода c контрактом сервиса:
SPMSUBPServiceContract

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
 
namespace SPMSUBPService
{
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        SPMClientInfoResponse SPMClientInfo(string Login);
    }
 
    [DataContract]
    public class SPMClientInfoResponse
    {
        bool success = true;
        string errorText = "";
 
        [DataMember]
        public bool Success
        {
            get { return success; }
            set { success = value; }
        }
 
        [DataMember]
        public string ErrorText
        {
            get { return errorText; }
            set { errorText = value; }
        }
    }
}

и схему исходного кода c реализацие сервиса:
SPMSUBPService

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
 
namespace SPMSUBPService
{
    public class SPMSUBPService : IService
    {
        public SPMClientInfoResponse SPMClientInfo(string Login)
        {
            return new SPMClientInfoResponse();
        }
    }
}

В папке Terrasoft.WebApp\ServiceModel создаем файл SPMSUBPService.svc с текстом:
SPMSUBPService.svc
<%@ ServiceHost Language="C#" Debug="true" Service="SPMSUBPService.SPMSUBPService" Factory="System.ServiceModel.Activation.ServiceHostFactory" %>
Добавляем в файл Terrasoft.WebApp\ServiceModel\http\services.config описание нашего сервиса:
services.config

<services>
    ...
    <service behaviorConfiguration="BaseServiceBehavior" name="SPMSUBPService.SPMSUBPService">
        <endpoint name="SPMSUBPServiceEndPoint"
            binding="webHttpBinding"
            behaviorConfiguration="RestServiceBehavior"
            bindingNamespace="http://Terrasoft.WebApp.ServiceModel"
            contract="SPMSUBPService.IService" />
        <endpoint address="soap" binding="basicHttpBinding" contract="SPMSUBPService.IService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
    ...
</services>

Модифицируем Terrasoft.WebApp\Web.config
Web.config

...
<location path="ServiceModel/SPMSUBPService.svc">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
</location>
...

Готово!
Сервис доступен по адресу: /0/ServiceModel/SPMSUBPService.svc
WSDL тоже есть: /0/ServiceModel/SPMSUBPService.svc?singleWsdl

Артем, спасибо большое за ответ, попробую сделать.

Отлично, все получилось. Спасибо!

При попытке создания прокси WCF стали появляться ошибки.

1. Если в проект консольного приложения MS Visual Studio добавить ссылку на wsdl Web- сервиса (Add service reference):

An error occured while attempting to find services at h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService.svc?wsdl
 
Details 
 
Was an error downloading ' h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService.svc?wsdl/$metadata'.
The request failed with the error message:
--
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/0/ServiceModel/UsrSPMSUBPService.svc?wsdl/$metadata">here</a>.</h2>
</body></html>
 
--
Metadata contains a reference that cannot be resolved: 'h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService.svc?wsdl'.
The remote server returned an unexpected response: (302) Found.
Too many automatic redirections were attempted.
If the service is defined in the current solution, try building the solution and adding the service reference again.

2. Если для генерации прокси- классов использовать ServiceModel Metadata Utility Tool (Svcutil.exe), то следующая команда:

svcutil.exe /language:cs /out:generatedProxy.cs /config:app.config h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService.svc?wsdl

Завершается с такой ошибкой:

WS-Metadata Exchange Error
	URI: h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService?wsdl
 
	Метаданные содержат неразрешимую ссылку "h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService?wsdl"
 
	Удаленный сервер вернул неожиданный ответ: (302) Found.
 
	Слишком много попыток автоматического перенаправления.
 
HTTP Get Error
	URI: h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService?wsdl
 
	Возникла ошибка при загрузке "h t t p://localhost:8080/0/ServiceModel/UsrSPMSUBPService?wsdl"
 
	Сбой запроса с сообщением об ошибке
 
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/0/ServiceModel/UsrSPMSUBPService.svc?wsdl/$metadata">here</a>.</h2>
</body></html>

Сам сервис и WSDL доступны:

--

UsrSPMSUBPService Служба

Служба создана.

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

svcutil.exe http://localhost:8080/0/ServiceModel/UsrSPMSUBPService.svc?wsdl
Доступ к описанию службы также можно получить как к одному файлу:

http://localhost:8080/0/ServiceModel/UsrSPMSUBPService.svc?singleWsdl
Это ведет к созданию файла конфигурации и файла кода, содержащего класс клиента. Добавьте эти два файла в клиентское приложение и используйте сгенерированный класс клиента для вызова службы. Например:

C#

class Test
{
    static void Main()
    {
        ServiceClient client = new ServiceClient();
 
        // Используйте переменную "client", чтобы вызвать операции из службы.
 
        // Всегда закройте клиент.
        client.Close();
    }
}

Visual Basic

Class Test
    Shared Sub Main()
        Dim client As ServiceClient = New ServiceClient()
        ' Используйте переменную "client", чтобы вызвать операции из службы.
 
        ' Всегда закройте клиент.
        client.Close()
    End Sub
End Class

Почему не удается сгенерировать прокси- классы?

C ?FlatWsdl я удаляю все ссылки xsd:import, но это не помогает.

Артем, не могли бы Вы подсказать, как теперь сгенерировать прокси- классы для клиента?

Получилось примерно таким образом.

Есть утилита wsdl.exe

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\wsdl.exe

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

На этом тему можно считать закрытой.

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

Добрый день.

Есть некий web-service (wcf и использует wsHttpBinding) и методы для работы с ним.
Необходимо из террасофта работать с данными методами.

Есть понимание как это сделать в Visual Studio например на с#
Для этого к проекту добавляется ServiceReference (с указание ссылки на наш веб-сервис), на его основе создается объект и дальнейшая работа (авторизация и обращение к методам) происходит через этот объект. Примерно так...

SomeServiceReference.ServiceClient client = new SomeServiceReference.ServiceClient();
if (client.ClientCredentials != null)
{
client.ClientCredentials.UserName.UserName = "UserName";
client.ClientCredentials.UserName.Password = "Password";
client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
}

try
{
return client.InvokeMethod( parameter );
}
catch( Exception ex )
{
client.Abort();
throw ex;
}
finally
{
if( client != null ) client.Close();
}

В с# также есть возможность программно создать экземпляр System.ServiceModel.WSHttpBinding и с помощью него организовать взаимодействие со сторонним веб-сервисом.
А вот как организовать подобную схему из Террасофта не понятно.

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

Спасибо.

Нравится

1 комментарий

Можно Вашу разработку на C# переделать в COM-объект. А затем этот объект в Terrasoft 3.Х вызывать из скрипта.

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

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

Приглашаю Вас посетить вторую часть тренинга по технологии 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

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