Интеграция BPMonline с сайтом

Добрый день!
Есть такая задача: Пользователь на сайте заполняет форму и нажимает кнопку "Отправить". По этим данным в BPMonline создается лид и вызывается функция обработки данных.
После этого нужно на сайте получить результат обработки BPMonline.

В BPMonline добавил форму для внешних ресурсов, расположил ее на сайте, лид в BPMonline создается. При создании лида запускается бизнес-процесс для обработки данных (выполняется примерно 15 секунд).

Подскажите, как лучше реализовать вывод результата на сайте?

Нравится

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

Отправить POST запрос на сайт из БП?

using (var wb = new WebClient())
{
    var data = new NameValueCollection();
    data["username"] = "myUser";
    data["password"] = "myPassword";
 
    var response = wb.UploadValues(url, "POST", data);
}

Дмитрий, спасибо.
Пользователь находится на сайте, он же не увидит изменений в браузере?

От сайта зависит. Если там каким либо образом по AJAX рефрешатся данные с сервера - то увидит.

А можно яваскриптом сделать запрос к BPMonline, для получения определенного поля лида? Чтобы не записывать данные в базу сайта.

Можно. В BPM есть поддержка протокола OData.
Всё стандартно - поэтому можно нагуглить + здесь в сообществе есть пару тем с примерами.

Можно работать с BPMonline через OData. Вот примеры стороннего приложения на PHP и на C#.

Теоретически можно и на JS, примеры работы с OData (не в BPMonline) есть тут.

Спасибо за примеры.
Попробовал сделать запрос по примеру в файле Doc. Не могу понять как подключить Sencha Touch API.
Если делать с помощью библиотеки datajs, то запрос не отрабатывает, результат не получается.
Нет ли работающих примеров?

<script src="js/datajs-1.1.2.min.js" type="text/javascript"></script>
<script type="text/javascript">   
	var url = "http://178.205.103.43:99/0/ServiceModel/EntityDataService.svc/LeadCollection";
	OData.read(
        {requestUri: url, 
		headers: {
			'Content-Type': 'application/json',		
			'Accept': 'application/json',
			'Authorization': 'Basic ' + base64encode('Пользователь 1:Пользователь 1')
		}},
        function (data, response) {
            // successful
			var a=0;
        },
        function (error) {
            // error
			var a=0;
        }
	)
 
	 function base64encode(str) {
		// Символы для base64-преобразования
		var b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg'+
					   'hijklmnopqrstuvwxyz0123456789+/=';
		var b64encoded = '';
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
 
		for (var i=0; i<str.length;) {
			chr1 = str.charCodeAt(i++);
			chr2 = str.charCodeAt(i++);
			chr3 = str.charCodeAt(i++);
 
			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
 
			enc3 = isNaN(chr2) ? 64:(((chr2 & 15) << 2) | (chr3 >> 6));
			enc4 = isNaN(chr3) ? 64:(chr3 & 63);
 
			b64encoded += b64chars.charAt(enc1) + b64chars.charAt(enc2) +
						  b64chars.charAt(enc3) + b64chars.charAt(enc4);
		}
		return b64encoded;
	} 
</script>

Вылезает ошибка:
Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на http://127.0.0.1:99/0/ServiceModel/EntityDataService.svc/LeadCollection…. Это может быть исправлено путем перемещения ресурса в тот же домен или включением CORS.

Скорее всего запрос идет с другого домена. А кросс-доменные запросы по дефолту запрещены. Решается добавлением на сервере в Access-Control-Allow-Origin вашего домена.

А как это можно сделать?

У Вас IIS? Вот тут посмотрите. Вместо звездочки можно добавить конкретно Ваш домен, чтобы принимать кросс-доменные запросы только от одного домена.

Спасибо. В заголовок Access-Control-Allow-Origin добавил.
Сообщение "Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на http://127.0.0.1:99/0/ServiceModel/EntityDataService.svc/LeadCollection…. Это может быть исправлено путем перемещения ресурса в тот же домен или включением CORS." до сих пор вылазит.
Но теперь еще отображается ошибка
OPTIONS http://127.0.0.1:99/0/ServiceModel/EntityDataService.svc/LeadCollection… 401 (Unauthorized)
XMLHttpRequest cannot load http://127.0.0.1:99/0/ServiceModel/EntityDataService.svc/LeadCollection…. Invalid HTTP status code 401

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

<script type="text/javascript">   
	var url = "http://127.0.0.1:99/0/ServiceModel/EntityDataService.svc/LeadCollection?$top=1";
	OData.read(
        {requestUri: url,
		headers: { 
			'Content-Type': 'application/json',		
			'Accept': 'application/json',
			'Authorization' : 'Basic ' + base64encode("Test:Test") }
		}, 
        function (data, response) {
            // successful
			abc();
        },
        function (error) {
            // error
			abc();
        }
	) 
 
	function base64encode(str) {
		// Символы для base64-преобразования
		var b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg'+
								   'hijklmnopqrstuvwxyz0123456789+/=';
		var b64encoded = '';
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
 
		for (var i=0; i<str.length;) {
			chr1 = str.charCodeAt(i++);
			chr2 = str.charCodeAt(i++);
			chr3 = str.charCodeAt(i++);
 
			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
 
			enc3 = isNaN(chr2) ? 64:(((chr2 & 15) << 2) | (chr3 >> 6));
			enc4 = isNaN(chr3) ? 64:(chr3 & 63);
 
			b64encoded += b64chars.charAt(enc1) + b64chars.charAt(enc2) +
									  b64chars.charAt(enc3) + b64chars.charAt(enc4);
		}
		return b64encoded;
        } 
 
	function abc() {
		var a = 1;
		alert("dd");
	}
</script>

А права на OData и на объект "Лид" есть? И что если с другого домена ввести линк в браузер? ЗАпрос на авторизацию пойдет?

Права есть. Если я ввожу ссылку в браузере, то идет запрос имени и пароля и выдается XML с результатом.
С другого компьютера пробовал, та же ошибка 401 (Unauthorized)

Всё верно, нужно авторизовать запрос. Браузер предлагает Вам это сделать автоматом, ну а тут нужно делать вручную. На SDK есть пример, но там HTTP запросы отправляются c# кодом. Необходимо адаптировать под JS:

http://www.terrasoft.ru/bpmonlinesdk/
Статьи
API BPMonline
OData
Работа с объектами BPMonline по протоколу OData с использованием Http-запросов

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

протестировал ваш пример на своей конфигурации. Все работает. здесь у вас вопрос только в правах, как и писала техническая поддержка. Внимательно посмотрите под кем у вас идет Соединение с БД в IIS, какими правами обладает тот пользователь. Проверьте какими правами обладает пользователь из под которого идет подключение к БД в скрипте (пример которого вы приводили ранее). Как и писала техническая поддержка права должны быть розданы на Операцию - "Доступ к Odata", права должны быть розданы на Объект - "Лид". Все данные действия выполняются в Разделе "Администрирование" BPMOnline.
будут дополнительные вопросы задавайте поможем.

Михаил, добрый день!
Проверил права, вроде все нормально.
У меня в заголовках запроса не отображается заголовок Authorization. А у вас?
Если перехожу по ссылке в браузере, то заголовок отображается.

Дмитрий, подскажите, пожалуйста, в каких пространствах имен находятся объекты WebClient и NameValueCollection?

NameValueCollection нашел, в System.Collections.Specialized

Прошу прощения, думал, что WebClient это класс террасофтовский, оказалось System.Net)
Вопрос с авторизацией по OData остается открытым.

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

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

headers: {
		'Authorization': 'Basic ' + Ext.util.base64.encode('S.Karlo:S.Karlo')
	}

где S.Karlo - логин и пароль.

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

Кстати, есть же отдельный сервер по авторизации (в примере на C# вначале отправляется запрос на него):

private const string authServiceUtri = "http://<имя_сервера>/<имя_приложения_BPMonline>/ServiceModel/AuthService.svc/Login";
// Создание запроса на аутентификацию.
    var authRequest = HttpWebRequest.Create(authServiceUtri) as HttpWebRequest;
    authRequest.Method = "POST";
    authRequest.ContentType = "application/json";
    var bpmCookieContainer = new CookieContainer();
    // Включение использования cookie в запросе.
    authRequest.CookieContainer = bpmCookieContainer;
    // Получение потока, ассоциированного с запросом на аутентификацию.
    using (var requesrStream = authRequest.GetRequestStream())
    {
        // Запись в поток запроса учетных данных пользователя BPMonline и дополнительных параметров запроса.
        using (var writer = new StreamWriter(requesrStream))
        {
            writer.Write(@"{
                                ""UserName"":""" + userName + @""",
                                ""UserPassword"":""" + userPassword + @""",
                                ""SolutionName"":""TSBpm"",
                                ""TimeZoneOffset"":-120,
                                ""Language"":""Ru-ru""
                                }");
        }
    }
    // Получение ответа от сервера. Если аутентификация проходит успешно, в объекте bpmCookieContainer будут 
    // помещены cookie, которые могут быть использованы для последующих запросов.
    using (var response = (HttpWebResponse)authRequest.GetResponse())
    {
        // Создание запроса на получение данных от сервиса OData.
        var dataRequest = HttpWebRequest.Create(serverUri + "ContactCollection?select=Id, Name")
                                as HttpWebRequest;
        // Для получения данных используется HTTP-метод GET.
        dataRequest.Method = "GET";
        // Добавление полученных ранее аутентификационных cookie в запрос на получение данных.
        dataRequest.CookieContainer = bpmCookieContainer;
        // Получение ответа от сервера.
        using (var dataResponse = (HttpWebResponse)dataRequest.GetResponse())
        {
            // Загрузка ответа сервера в xml-документ для дальнейшей обработки.
            XDocument xmlDoc = XDocument.Load(dataResponse.GetResponseStream());

Здравствуйте! Подскажите пожалуйста сгенерированный bpm'online CRM код формы внешних ресурсов вызывает событие error при добавлении заявки в админку через браузеры IE8,9, а также opera Mini и некоторых версий других браузеров (как мобильных так и настольных). Ведь эти браузеры из стандарта не исключены, тогда почему они не поддерживаются и в чистом виде сгенерированный код не работает?!

Спасибо!

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

Я так понимаю, что адаптация под все используемые броузеры и их версии была бы слишком трудоемкой. Поэтому ограничились самыми популярными, которыми пользуется 95% пользователей.

Добрый день,
Подскажите как используя протокол OData получить коллекцию объектов в формате json, делаю запрос вида : имя_приложения/0/ServiceModel/EntityDataService.svc/AccountCollection?$format=json
в ответ получаю ошибку

<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
[geshifilter-code]4[/geshifilter-code]
<message xml:lang="">Запрошен неподдерживаемый тип носителя.</message>
<innererror>
<message>Запрошен неподдерживаемый тип носителя.</message>
<type>System.Data.Services.DataServiceException</type>
<stacktrace>
at System.Data.Services.ResponseBodyWriter..ctor(Boolean hasMoved, IDataService service, IEnumerator queryResults, RequestDescription requestDescription, IODataResponseMessage responseMessage, ODataPayloadKind payloadKind)
 at System.Data.Services.DataService`1.CreateResponseBodyWriter(Boolean hasMoved, RequestDescription requestDescription, IDataService service, IEnumerator queryResults, IODataResponseMessage responseMessage)
 at System.Data.Services.DataService`1.SerializeResponseBody(RequestDescription description, IDataService dataService, IODataResponseMessage responseMessage)
 at System.Data.Services.DataService`1.HandleRequest()
</stacktrace>
<internalexception>
<message>
Не удалось найти поддерживаемый тип MIME, соответствующий допустимым типам MIME для запроса. Поддерживаемые типы "application/atom+xml;type=feed, application/atom+xml, application/json;odata=verbose" не соответствуют ни одному из допустимых типов MIME "application/json".
</message>
<type>Microsoft.Data.OData.ODataContentTypeException</type>
<stacktrace>
at Microsoft.Data.OData.MediaTypeUtils.RemoveApplicationJsonFromAcceptableMediaTypes(IList`1 specifiedTypes, MediaTypeWithFormat[] supportedMediaTypes, String acceptableMediaTypes)
 at Microsoft.Data.OData.MediaTypeUtils.GetContentTypeFromSettings(ODataMessageWriterSettings settings, ODataPayloadKind payloadKind, MediaTypeResolver mediaTypeResolver, MediaType& mediaType, Encoding& encoding)
 at Microsoft.Data.OData.ODataMessageWriter.EnsureODataFormatAndContentType()
 at Microsoft.Data.OData.ODataMessageWriter.SetHeaders(ODataPayloadKind payloadKind)
 at Microsoft.Data.OData.ODataUtils.SetHeadersForPayload(ODataMessageWriter messageWriter, ODataPayloadKind payloadKind)
 at System.Data.Services.ResponseBodyWriter..ctor(Boolean hasMoved, IDataService service, IEnumerator queryResults, RequestDescription requestDescription, IODataResponseMessage responseMessage, ODataPayloadKind payloadKind)
</stacktrace>
</internalexception>
</innererror>
</error>

следуя стандарту OData все должно работать, где искать ошибку?

P.S в формате xml данные возвращаются нормально, Версия 7.4.0.2924

И еще один вопрос в версии 7.5.0.627 при попытке обращения к коллекциям через EntityDataService.svc возникает ошибка
"Для схемы "SysModuleEntity" определено несколько одинаковых позиций по распределению прав по операциям"
1

Здравствуйте, Олег!

Касательно последнего комментария.

В принципе, текст ошибки говорит сам за себя.

В разделе "Доступ к объектам" найдите схему SysModuleEntity (выведите колонку "Название") и посмотрите на детали "Доступ к объекту", нет ли там дублирующихся записей.

Добрый день, вроде ничего не дублируется http://goo.gl/Btchjj

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

При обработке этого запроса произошла ошибка.При обработке этого запроса произошла ошибка.System.Data.Services.DataServiceException at System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)
 at System.Data.Services.Serializers.Deserializer.HandlePostRequest()
 at System.Data.Services.DataService`1.HandlePostOperation(RequestDescription description, IDataService dataService)
 at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)
 at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)
 at System.Data.Services.DataService`1.HandleRequest()В элементе {http://schemas.microsoft.com/ado/2007/08/dataservices/metadata}:properties обнаружено свойство "LeadType" типа "Terrasoft.Configuration.Lead", объявленное как свойство навигации. Свойства навигации в ATOM должны быть представлены элементами {http://www.w3.org/2005/Atom}:link.

собственно вопрос - как должны быть представлены свойства навигации в АТОМ? по ссылке на сам стандарт что то ничего путного найти не смог

P.S. все дело в PHP происходит, если возможно киньте пример валидного xml файла, добавление к тегу d:LeadType атрибута m:type="Edm.Guid" не помогает

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

<?xml version="1.0" encoding="utf-8"?>
<entry xml:base="http://softex-iis:7503/0/ServiceModel/EntityDataService.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml">
  <content type="application/xml">
    <m:properties>
    <d:LeadName>Тестовый лид</d:LeadName>
    <d:Contact>Тестовый лид</d:Contact>
    <d:Email>test@test.test</d:Email>
    <d:MobilePhone>+79999999999</d:MobilePhone>
    <d:Account>Компания</d:Account>
    <d:FullJobTitle>Должность</d:FullJobTitle>
    <d:Address>Адрес</d:Address>
    <d:LeadType m:type="Edm.Guid">c1b80de6-2070-4395-b42d-8dd4df195b85</d:LeadType>
    </m:properties>
  </content>
</entry>

Олег, закономерный вопрос: у Вас в системе есть тип лида с Id "c1b80de6-2070-4395-b42d-8dd4df195b85"?

Да, конечно, копировал значение id типа из справочника прямо в bpm

Олег, приведите, пожалуйста, полный текст ошибки, которая возникает.

При обработке этого запроса произошла ошибка.При обработке этого запроса произошла ошибка.System.Data.Services.DataServiceException at System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)
at System.Data.Services.Serializers.Deserializer.HandlePostRequest()
at System.Data.Services.DataService`1.HandlePostOperation(RequestDescription description, IDataService dataService)
at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)
at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)
at System.Data.Services.DataService`1.HandleRequest()В элементе {http://schemas.microsoft.com/ado/2007/08/dataservices/metadata}:properties обнаружено свойство "LeadType" типа "Terrasoft.Configuration.Lead", объявленное как свойство навигации. Свойства навигации в ATOM должны быть представлены элементами {http://www.w3.org/2005/Atom}:link.Microsoft.Data.OData.ODataException at Microsoft.Data.OData.Atom.ODataAtomPropertyAndValueDeserializer.ReadPropertiesImplementation(IEdmStructuredType structuredType, List`1 properties, DuplicatePropertyNamesChecker duplicatePropertyNamesChecker, Boolean epmPresent)
at Microsoft.Data.OData.Atom.ODataAtomEntryAndFeedDeserializer.ReadAtomContentElement(IODataAtomReaderEntryState entryState)
at Microsoft.Data.OData.Atom.ODataAtomEntryAndFeedDeserializer.ReadAtomElementInEntry(IODataAtomReaderEntryState entryState)
at Microsoft.Data.OData.Atom.ODataAtomEntryAndFeedDeserializer.ReadEntryContent(IODataAtomReaderEntryState entryState)
at Microsoft.Data.OData.Atom.ODataAtomReader.ReadAtEntryStartImplementation()
at Microsoft.Data.OData.ODataReaderCore.ReadImplementation()
at Microsoft.Data.OData.ODataReaderCore.InterceptException[T](Func`1 action)
at System.Data.Services.Serializers.EntityDeserializer.ReadEntry(ODataReader odataReader, SegmentInfo topLevelSegmentInfo)
at System.Data.Services.Serializers.EntityDeserializer.Read(SegmentInfo segmentInfo)
at System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)

А, то есть проблема из предыдущего комментария, а не новая.
Наверное, xml должен быть таким же, как приходит ответ на запрос данных. Например:

<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Owner" type="application/atom+xml;type=entry" title="Owner" href="ContactCollection(guid'86b19772-954a-4d6a-a12c-01d1cf2423f6')/Owner" /><

Понял что вы имеете ввиду, попробую добавить еще и линки, спасибо

Добрый день, возник следующий вопрос, как выбрать файл прикрепленный к объекту?
Для примера - есть объект Event, нужно вытянуть прикрепленный к нему файл, если обращаться через связи объекта:
0/ServiceModel/EntityDataService.svc/EventCollection(guid'418dfd32-e1b9-4cdd-aafa-4d5b7d38e681')/EventFileCollectionByEvent
получаю следующую ошибку

<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
[geshifilter-code]4[/geshifilter-code]
<message xml:lang="">Не реализовано</message>
<innererror>
<message>Не реализовано</message>
<type>System.Data.Services.DataServiceException</type>
<stacktrace>
at System.Data.Services.WebUtil.GetRequestEnumerator(IEnumerable enumerable)
 at System.Data.Services.DataService`1.SerializeResponseBody(RequestDescription description, IDataService dataService, IODataResponseMessage responseMessage)
 at System.Data.Services.DataService`1.HandleRequest()
</stacktrace>
<internalexception>
<message>Method 'SelectMany' not supported</message>
<type>System.NotSupportedException</type>
<stacktrace>
at Terrasoft.Core.Entities.EntityQueryProvider.VisitMethodCall(MethodCallExpression node)
 at Terrasoft.Core.Entities.EntityQueryProvider.Build(Expression expression)
 at Terrasoft.Core.Entities.EntityQueryProvider.LoadEntityCollection(Expression expression)
 at Terrasoft.Core.Entities.EntityQueryProvider.ExecuteEnumerable(Type elementType, Expression expression)
 at Terrasoft.Core.Entities.EntityQuery`1.GetEnumerator()
 at System.Data.Services.WebUtil.GetRequestEnumerator(IEnumerable enumerable)
</stacktrace>
</internalexception>
</innererror>
</error>

если заходить со стороны объекта EventFile - /0/ServiceModel/EntityDataService.svc/EventFileCollection
то видно что у него есть свойство d:EventId m:type="Edm.Guid", но при попытке сортировать коллекцию по нему - /0/ServiceModel/EntityDataService.svc/EventFileCollection?$filter=EventId%20eq%20guid%27418dfd32-e1b9-4cdd-aafa-4d5b7d38e681%27 появляется другая ошибка:

<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
[geshifilter-code]1[/geshifilter-code]
<message xml:lang="">Элемент коллекции с именем EventId не найден</message>
<innererror>
<message>Элемент коллекции с именем EventId не найден</message>
<type>Terrasoft.Common.ItemNotFoundException</type>
<stacktrace>
at Terrasoft.Core.MetaItemCollection`1.GetByName(String name)
 at Terrasoft.Core.Entities.EntitySchema.GetInheritedPath(String columnPath)
 at Terrasoft.Core.Entities.EntitySchemaQuery.CreateSchemaColumnExpression(EntitySchemaQuery parentQuery, EntitySchema rootSchema, String columnPath, Boolean useCoalesceFunctionForMultiLookup, Boolean useDisplayValue)
 at Terrasoft.Core.Entities.EntityQueryWhereBlockBuilder.CreateExpression(Expression node)
 at Terrasoft.Core.Entities.EntityQueryWhereBlockBuilder.CreateSimpleFilter(BinaryExpression binary)
 at Terrasoft.Core.Entities.EntityQueryWhereBlockBuilder.CreateFilter(Expression node)
 at Terrasoft.Core.Entities.EntityQueryWhereBlockBuilder.BuildBlock(MethodCallExpression node)
 at Terrasoft.Core.Entities.EntityQueryProvider.VisitMethodCall(MethodCallExpression node)
 at Terrasoft.Core.Entities.EntityQueryProvider.Build(Expression expression)
 at Terrasoft.Core.Entities.EntityQueryProvider.LoadEntityCollection(Expression expression)
 at Terrasoft.Core.Entities.EntityQueryProvider.ExecuteEnumerable(Type elementType, Expression expression)
 at Terrasoft.Core.Entities.EntityQuery`1.GetEnumerator()
 at System.Data.Services.WebUtil.GetRequestEnumerator(IEnumerable enumerable)
 at System.Data.Services.DataService`1.SerializeResponseBody(RequestDescription description, IDataService dataService, IODataResponseMessage responseMessage)
 at System.Data.Services.DataService`1.HandleRequest()
</stacktrace>
</innererror>
</error>

собственно вопрос как тогда вытянуть файлы прикрепленные к объекту зная его guid?

Проблема в общем по сортировке когда есть внешние ключи вроде TypeId или EventId, как правильно их сортировать?
Андрей, это вроде не совсем то что нужно, мне не нужно заливать, мне просто надо вытащить, как вытащить я знаю, но у меня проблема просто в сортировке результатов используя OData, как видно на ошибке выше я понял что не все функции OData реализованы, как минимум поддержка json в 7.5 отсутствует. Поэтому и спрашиваю как отсортировать коллекцию у объектов которой есть внешние ключи по которым нужно сортировать
В приведенном вами примере я не могу найти как делается сортировка, просто берется первая запись из коллекции

// Читаем первую запись из коллекции файлов
    BpmonlineService.File file = (from f in context.FileCollection
                                  select f).First();
 
// Тип передаваемого контента
    DataServiceRequestArgs _args = new DataServiceRequestArgs();
    _args.ContentType = "application/octet-stream";

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

Олег, но ведь это LINQ:

(from f in context.FileCollection
                                  select f).First()

Здесь же Вы можете добавить и сортировку.

Перечитал еще раз Ваш пост. Не совсем теперь понял: Вы пишите "сортировка", а приводите кусок кода с фильтрацией.
А тут у Вас другая ошибка:

 /0/ServiceModel/EntityDataService.svc/EventFileCollection?$filter=EventId%20eq%20guid%27418dfd32-e1b9-4cdd-aafa-4d5b7d38e681%27

Фильтр должен быть по полю Event, а не EventId, так как в объектной модели поле называется именно "Event". Вроде в тексте ошибки это и написано.

"Андрей Каспаревич" написал:
Фильтр должен быть по полю Event, а не EventId, так как в объектной модели поле называется именно "Event"

К полю Event не допустим оператор eq, вылетает ошибка что невозможно сравнивать Terrasoft.Configuration.Event и Edm.Guid
Извиняюсь, видимо неверно выразился, интересует именно фильтрация коллекции при выборке

Попробуйте тогда так:

 /0/ServiceModel/EntityDataService.svc/EventFileCollection?$filter=Event/Id%20eq%20guid%27418dfd32-e1b9-4cdd-aafa-4d5b7d38e681%27

Кстати, пример сортировки в запросе к OData есть в нашем SDK:

string requestUri = serverUri + "ContactCollection?$top=4&$skip=1&$orderby=City/Name";

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

Добрый день, очередной виток с интеграцией, теперь нужно сделать интеграцию из JS, собственно запрос следующий

var serviceUrl = "http://*********/0/ServiceModel/EntityDataService.svc/";
  $.ajax({
    url: serviceUrl + 'ContactCollection',
    headers: {
        'Content-Type': 'application/json',    
        'Accept': 'application/json',
        'Authorization': 'Basic ' + btoa('Пользователь 1:Пользователь 1')
    },
    method: 'GET'
  }).done(function(data) {
    console.log(data)
  }).error(function(data) {
    console.log(data)
  });

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

Да, забыл добавить, если убрать передачу headers и делать запрос на тестовую базу OData
http://services.odata.org/V3/Northwind/Northwind.svc/Products
Запрос проходит нормально и данные возвращаются

Здравствуйте!

Какая ошибка приходит в ответ на запрос?

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