|
04.03.2011, 20:00 | #1 |
Участник
|
Вопрос по Soap запросам в CRM 2011
У меня есть запрос Код: var fetch = '<fetch distinct="false" no-lock="false" mapping="logical"><entity name="account"><all-attributes /></entity></fetch>'; var SoapRequest = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"; SoapRequest += "<s:Body>"; SoapRequest += "<RetrieveMultiple xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\""; SoapRequest += " xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">"; SoapRequest += "<query i:type=\"a:FetchExpression\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">"; SoapRequest += "<a:Query>" + fetch.replace(/</g, "<").replace(/>/g, ">") + "</a:Query>"; SoapRequest += "</query>"; SoapRequest += "</RetrieveMultiple>"; SoapRequest += "</s:Body>"; SoapRequest += "</s:Envelope>"; var oReq = new XMLHttpRequest(); var url = "/" + ORG_UNIQUE_NAME + "/XRMServices/2011/Organization.svc/web"; oReq.open("POST", url, false); oReq.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/RetrieveMultiple"); oReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); oReq.setRequestHeader("Content-Length", SoapRequest.length); oReq.send(SoapRequest); alert(oReq.responseText); То, что он возвращает сложно для чтения и понимания нормальному человеку 1. Хотелось бы знать как изменить запрос чтобы CRMService вернул что-то более читабельное. (например JSON string) 2. Можно ли делать soap запросы с "Impersonate a User" (по userid например)Заранее благодарен Константин
__________________
Читайте SDK!!! |
|
05.03.2011, 12:34 | #2 |
Участник
|
Цитата:
Цитата:
Разумеется, изменение запроса не изменит формат возвращаемых данных. Т.е. нет никаких опций и других поддерживаемых форматов. Есть только готовые библиотеки сторонних разработчиков, которые умеют парсить результат в удобоваримые массивы объектов, как, например, Ascentium. Но все они под CRM 4.0. Насколько я знаю, под CRM 2011 еще ни у кого ничего нет. Если вдруг уже есть, буду только рад посмотреть ссылочку. Fetch всегда выполняется в контексте пользователя, который вызывает веб-сервис. Согласитесь, если бы в запросе можно было бы указать ID любого пользователя и получить данные, которые должен видеть этот пользователь, это было бы несекьюрно?
__________________
Опыт позволяет ошибаться гораздо увереннее. |
|
05.03.2011, 15:08 | #3 |
Чайный пьяница
|
Мой коллега Даниэл Кай пишет, что его фреймфорк - по прежнему работает - http://danielcai.blogspot.com/2011/0...s-for-crm.html
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: Гуревич Денис (2). |
05.03.2011, 15:38 | #4 |
Участник
|
Цитата:
Сообщение от a33ik
Мой коллега Даниэл Кай пишет, что его фреймфорк - по прежнему работает - http://danielcai.blogspot.com/2011/0...s-for-crm.html
__________________
Опыт позволяет ошибаться гораздо увереннее. |
|
05.03.2011, 21:53 | #5 |
Участник
|
Цитата:
Сообщение от a33ik
Мой коллега Даниэл Кай пишет, что его фреймфорк - по прежнему работает - http://danielcai.blogspot.com/2011/0...s-for-crm.html
То, что его код работает через сервис 4 в 5 это заслуга MS, а не его.
А как насчёт новых возможностей, которые как я понимаю через сервис 4 не доступны?
__________________
Читайте SDK!!! |
|
05.03.2011, 23:44 | #6 |
Чайный пьяница
|
Цитата:
Цитата:
PS Критика ради критики - не имеет смысла
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
06.03.2011, 08:09 | #7 |
Участник
|
А где Вы тут нашли критику? P. S. Я вообще-то пытался здесь поговорить о 5, а не о 4. ( что существует для 4 я худо бедно знаю)
__________________
Читайте SDK!!! Последний раз редактировалось Konstantin Katsovich; 06.03.2011 в 08:13. |
|
05.03.2011, 21:18 | #8 |
Участник
|
Цитата:
Разумеется, изменение запроса не изменит формат возвращаемых данных.
Что Вы говорите Например REST ENDPOINT позволяет вернуть xml или json (возможно есть ещё что-то), за счет изменения формы запроса в том же CRM ( я понимаю что это не заслуга CRM, но всё же). Цитата:
Т.е. нет никаких опций и других поддерживаемых форматов. Есть только готовые библиотеки сторонних разработчиков, которые умеют парсить результат в удобоваримые массивы объектов, как, например, Ascentium. Но все они под CRM 4.0. Насколько я знаю, под CRM 2011 еще ни у кого ничего нет. Если вдруг уже есть, буду только рад посмотреть ссылочку.
Я так и предполагал, что это не только меня волнует. Цитата:
Fetch всегда выполняется в контексте пользователя, который вызывает веб-сервис.
Fetch в данном случае был примером А другие запросы не в контексте пользователя? Цитата:
Согласитесь, если бы в запросе можно было бы указать ID любого пользователя и получить данные, которые должен видеть этот пользователь, это было бы несекьюрно?
Это именно так и происходит через "Impersonate a User"когда обращение происходит через C#. Какая разница если я могу со своего компьютера сделать запрос через C# почему с того же компьютера через SOAP нет? С Уважение Константин
__________________
Читайте SDK!!! |
|
09.03.2011, 12:06 | #9 |
Участник
|
Цитата:
Ну а зачем тогда вопрос задавали? У Вас все есть и все работает как надо - прекрасно! Цитата:
Зачем же все в одну кучу мешать? Серверный код - это не клиентский SOAP-запрос. Не хотите же Вы сказать, что можете с любой клиентской машины отправить в CRM на выполнение любой C# код?
__________________
Опыт позволяет ошибаться гораздо увереннее. |
|
09.03.2011, 22:06 | #10 |
Участник
|
Цитата:
Вопрос задавался по соап запросам, потому-что запустить fetch или любой другой crm message через rest endpoint, мне кажется нельзя. А Вы знаете как? Цитата:
Не надо мешать. Это разные вещи. Только одно но, Если Вы запустите fiddler и посмотрите запросы которые делает, скажем так код С#, то увидите там те же соап запросы. Цитата:
Любой – не любой!!! ДА хочу Откройте SDK там в этот раз (CRM 5) много различного C# кода, который у меня на клиентской машине оборудованной Windows 7 64bit бежит читает и создает записи в CRM. С Уважение Константин
__________________
Читайте SDK!!! |
|
10.03.2011, 12:02 | #11 |
Участник
|
Цитата:
Стало интересно, погрузился в SDK по 2011. И вот чего начитал (думаю, всем будет полезно немного теории): В CRM 2011 реализовано аж 2 интерфейса доступа к данным через веб-сервисы - REST Endpoint и SOAP Endpoint. Так вот REST Endpoint позволяет вернуть данные в нужном Вам JSON-формате, но для этого нужно формировать не Fetch-запрос, а OData-запрос. Я так понимаю, что конкретно Fetch Вам не особо уперся, а про OData-запросы в SDK вроде подробно написано. Только имейте ввиду, что REST Endpoint возвращает не более 50 записей за раз.
__________________
Опыт позволяет ошибаться гораздо увереннее. |
|
10.03.2011, 13:15 | #12 |
Участник
|
Цитата:
Сообщение от Konstantin Katsovich
Не надо мешать. Это разные вещи. Только одно но, Если Вы запустите fiddler и посмотрите запросы которые делает, скажем так код С#, то увидите там те же соап запросы. Любой – не любой!!! ДА хочу Откройте SDK там в этот раз (CRM 5) много различного C# кода, который у меня на клиентской машине оборудованной Windows 7 64bit бежит читает и создает записи в CRM. Как в 2011 поменять контекст пользователя при выполении SOAP-запроса из JScript'а я в SDK не нашел. Похоже, никак. Правда осталась обратная совместимость с веб-сервисами CRM 4.0, где указывался AuthenticationHeader, содержащий тэг CallerID (веб-сервис при этом все равно проверит, имеете ли вы право выполнять запрос от имени другого пользователя). Что касается C# кода: Вы можете написать на C#, скажем, консольное приложение, которое будет запускать на клиентской машине и внутри него имперсонироваться от имени другого пользователя и выполнить SOAP-запрос. В SDK вот тут написано, что для этого надо указать свойство OrganizationServiceProxy.CallerID. Но при этом пользователь, запускающий такое приложение должен обладать специальной привилегией или быть включенным в PrivUserGroup в AD.
__________________
Опыт позволяет ошибаться гораздо увереннее. |
|
10.03.2011, 17:10 | #13 |
Moderator
|
Давайте разберемся в терминах. Во первых, имперсонация уместна внутри системы. Когда, скажем, код выполняемый плагином или веб страницей выполняется с привилегиями пользователя отличного от того, кто инициировал данную операцию. Во-вторых, то о чем вы - это авторизация! При этом нужно передавать логин и пароль того пользователя от имени которого будете делать запрос. Осталось понять нафига.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
10.03.2011, 17:25 | #14 |
Участник
|
Цитата:
Цитата:
Да, это самая большая загадка.
__________________
Опыт позволяет ошибаться гораздо увереннее. |
|
10.03.2011, 18:37 | #15 |
Консультант-джедай
|
На вскидку... при создании, какой-либо записи необходимо выгрузить файлик CSV (с данными по этой записи) в интеграционную папку на сервере простой смертный юзвер не имеет туда доступ, а админ имеет (или какая-нить другая выделенная учетка) Вот и нужно выполнить код плагина под этой учеткой
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
|
За это сообщение автора поблагодарили: a33ik (-1). |
11.03.2011, 11:30 | #16 |
Участник
|
Цитата:
Сообщение от slivka_83
На вскидку... при создании, какой-либо записи необходимо выгрузить файлик CSV (с данными по этой записи) в интеграционную папку на сервере простой смертный юзвер не имеет туда доступ, а админ имеет (или какая-нить другая выделенная учетка) Вот и нужно выполнить код плагина под этой учеткой
__________________
Опыт позволяет ошибаться гораздо увереннее. |
|
11.03.2011, 15:13 | #17 |
Участник
|
Представим такую с ситуацию: (ситуация из жизни). У вас есть "Центр обслуживания клиентов"
Нужно запретить дублирования клиентов на стадии их создания. Поле по которому производится проверка заранее не известно. Как Вы предлагается это осуществить? Конечно возможно надо изменить ТЗ и т.д., но возможности такой нет, по другим не зависящим от нас программистов причин. P. S. Я вообще-то не люблю задавать такого рода вопросы и сам на них не отвечаю. Почему?
С Уважением Константин
__________________
Читайте SDK!!! |
|
11.03.2011, 15:50 | #18 |
Moderator
|
Цитата:
Ситуация более чем житейская. Варианты решения: плагин на пре-событие, который запустится в контексте системного процесса (или каким-то конкретным - плагины так умеют) и с полными привилегиями выполнит поиск и героически выбросит исключение, если пользователя клиента создавать нельзя. Пользователь получит пугающее сообщение об ошибке, форма затрется и все прочие ужасы. Это то, что вам в любом случае нужно реализовать. Рас уж вы рассуждаете про веб-сервисы, то я прихожу к выводу, что блокирование вы рассчитывали делать на уровне интерфейса. Категорически не советую! Не смогут сделать через форму - засунут через "преобразование интереса", импорт из Excel, через синхронизацию с Outlook, действием рабочего процесса или диалога, через мобильный клиент, или придумают новый новаторский способ, которого я еще не знаю! Плагину быть. Теперь, если стоит задача предупреждения самой попытки такого действия, то я бы не запрос писал, а кастомный сервис с анонимным доступом, который уже имперсонирует пользователя как надо, например, будучи запущенный в пуле под правильной учеткой.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
11.03.2011, 16:08 | #19 |
Участник
|
Цитата:
Сообщение от Артем Enot Грунин
Ситуация более чем житейская. Варианты решения: плагин на пре-событие, который запустится в контексте системного процесса (или каким-то конкретным - плагины так умеют) и с полными привилегиями выполнит поиск и героически выбросит исключение, если пользователя клиента создавать нельзя. Пользователь получит пугающее сообщение об ошибке, форма затрется и все прочие ужасы. Это то, что вам в любом случае нужно реализовать.
То что существует много разных решений я понимаю Цитата:
Сообщение от Артем Enot Грунин
Рас уж вы рассуждаете про веб-сервисы, то я прихожу к выводу, что блокирование вы рассчитывали делать на уровне интерфейса. Категорически не советую! Не смогут сделать через форму - засунут через "преобразование интереса", импорт из Excel, через синхронизацию с Outlook, действием рабочего процесса или диалога, через мобильный клиент, или придумают новый новаторский способ, которого я еще не знаю!
А кто же им даст!!! Вопрос был как сделатьэтоо через соап запрос?
__________________
Читайте SDK!!! |
|
11.03.2011, 15:54 | #20 |
Чайный пьяница
|
По идее - реализуется Pre-Create плагином, а поле по которому выполняется проверка - передаётся в тело через config. В случае дублирования - генерация исключения с соответствующим текстом. Плагин запускается под учётной записью администратоивного пользователя. Вроде бы - реализуемо.
Понятно, что через JavaScript c имперсонацией - более изящно. Также не отбрасывайте вариант написания своего кастомного вебсервиса и вызова его через JavaScript.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
|