AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.09.2009, 16:02   #1  
marbatov is offline
marbatov
Участник
 
18 / 10 (1) +
Регистрация: 29.09.2009
Плагин (при сохранении копирование вложений)
Пишу свой первый плагин. Необходима след. функциональность: при сохранении какой либо entity, все ее вложения копируются в соответствующую папку библиотеки в шарапойнт. Теоретически представляю как сделать: получить файлстрим и записать его.
Проблема в том, что в плагине никак не могу найти объект, с помощью которого можно получить доступ к вложениям сохраняемой сущности. Пробовал вытащить так

X++:
                CrmService service = context.CreateCrmService(false);
                TargetRetrieveDynamic target = new TargetRetrieveDynamic();
                target.EntityName = "new_test";
                target.EntityId = ((Microsoft.Crm.Sdk.Key)(entity.Properties["new_testid"])).Value;

                RetrieveRequest getAccount = new RetrieveRequest();
                getAccount.ReturnDynamicEntities = true;
                getAccount.Target = target;
                TargetRelatedDynamic a = new TargetRelatedDynamic();

                getAccount.ColumnSet = new ColumnSet( new string[] { "new_name", "new_testid" });

                RetrieveResponse retrieved = (RetrieveResponse)service.Execute(getAccount);
                DynamicEntity parentAccount = (DynamicEntity)retrieved.BusinessEntity;
но parentAccount содержит лишь общие поля new_test. Помогите куском кода
Старый 29.09.2009, 16:08   #2  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от marbatov Посмотреть сообщение
Пишу свой первый плагин. Необходима след. функциональность: при сохранении какой либо entity, все ее вложения копируются в соответствующую папку библиотеки в шарапойнт. Теоретически представляю как сделать: получить файлстрим и записать его.
Проблема в том, что в плагине никак не могу найти объект, с помощью которого можно получить доступ к вложениям сохраняемой сущности. Пробовал вытащить так

X++:
                CrmService service = context.CreateCrmService(false);
                TargetRetrieveDynamic target = new TargetRetrieveDynamic();
                target.EntityName = "new_test";
                target.EntityId = ((Microsoft.Crm.Sdk.Key)(entity.Properties["new_testid"])).Value;

                RetrieveRequest getAccount = new RetrieveRequest();
                getAccount.ReturnDynamicEntities = true;
                getAccount.Target = target;
                TargetRelatedDynamic a = new TargetRelatedDynamic();

                getAccount.ColumnSet = new ColumnSet( new string[] { "new_name", "new_testid" });

                RetrieveResponse retrieved = (RetrieveResponse)service.Execute(getAccount);
                DynamicEntity parentAccount = (DynamicEntity)retrieved.BusinessEntity;
но parentAccount содержит лишь общие поля new_test. Помогите куском кода
Как сохранить вложение к сущности.
Как загрузить из CRM вложение.
Как получить вложения сущности.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
За это сообщение автора поблагодарили: marbatov (1).
Старый 29.09.2009, 16:18   #3  
marbatov is offline
marbatov
Участник
 
18 / 10 (1) +
Регистрация: 29.09.2009
a33ik, спасибо, ссылка с вашего блога по первому впечатлению подходит
Старый 30.09.2009, 15:52   #4  
marbatov is offline
marbatov
Участник
 
18 / 10 (1) +
Регистрация: 29.09.2009
Следующая проблема
CRM работает под Network Services. Проблема в том, что у него нет прав на доступ к шарапойнт напрямую. Для этого я создал свой собственный WSDL, который под заданным пользователем выполняет аплоад документа.
При подключении вебсервиса к консольному приложению, все прекрасно работает.
X++:
        static void Main(string[] args)
        {
            SharepointConnector.FilesSoapClient connector = new SharepointConnector.FilesSoapClient();
            connector.ClientCredentials.UserName.UserName = "domen\user";
            connector.ClientCredentials.UserName.Password = "****";
            Console.ReadKey();
        }
при подключении кода к плагину валится на строке
X++:
 SharepointConnector.FilesSoapClient connector = new SharepointConnector.FilesSoapClient();
с ошибкой
Could not find default endpoint element that references contract 'SharepointConnector.FilesSoap' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element.

Пробовал плагин устанаваливать как на диск, так и в БД через registration tools. При установке на диск писал в
C:\Program Files\Microsoft Dynamics CRM\Server\bin\assembly
вручную скопировал WSSLetterIntegration.dll.config. Не помогло даже после iisrest

Последний раз редактировалось marbatov; 30.09.2009 в 15:59.
Старый 30.09.2009, 16:01   #5  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от marbatov Посмотреть сообщение
CRM работает под Network Services. Проблема в том, что у него нет прав на доступ к шарапойнт напрямую. Для этого я создал свой собственный WSDL, который под заданным пользователем выполняет аплоад документа.
При подключении вебсервиса к консольному приложению, все прекрасно работает.
X++:
        static void Main(string[] args)
        {
            SharepointConnector.FilesSoapClient connector = new SharepointConnector.FilesSoapClient();
            connector.ClientCredentials.UserName.UserName = "domen\user";
            connector.ClientCredentials.UserName.Password = "****";
            Console.ReadKey();
        }
при подключении кода к плагину валится на строке
X++:
 SharepointConnector.FilesSoapClient connector = new SharepointConnector.FilesSoapClient();
с ошибкой
Could not find default endpoint element that references contract 'SharepointConnector.FilesSoap' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element.
Не используйте конструктор по умолчанию. С ним проблемы именно в плагинах.
Посмотрите у эту статью. Тематика связана с вебсервисом репортинга, но не думаю, что большая разница будет именно в формировании экземпляра клиента.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 01.10.2009, 09:41   #6  
marbatov is offline
marbatov
Участник
 
18 / 10 (1) +
Регистрация: 29.09.2009
Попробовал сделать через ручное указание endpoint и bindingContext.
X++:
            BasicHttpBinding bind = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
            EndpointAddress endpoint = new EndpointAddress("http://server:6001/_vti_bin/Files.asmx");
            bind.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
            bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;

            SharepointConnector.FilesSoapClient client1 = new SharepointConnector.FilesSoapClient(bind, endpoint);
            client1.ClientCredentials.UserName.UserName = "domen\user";
            client1.ClientCredentials.UserName.Password = "****";

string s = client1.HelloWorld("qwe");
В консольном приложении отрабатывает на ура! В плагине валится на первой же строке с той же ошибкой.
X++:
BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
Наткнулся на схожую по проблеме статью, но описано как то слишком скуповато
Consuming a WCF service in MS Dynamics CRM 4.0 Workflow
Старый 01.10.2009, 15:56   #7  
marbatov is offline
marbatov
Участник
 
18 / 10 (1) +
Регистрация: 29.09.2009
Проблема решилась - появилась новая
Получилось вызвать самые простые веб-матоды моего веб-сервиса способом, подсказанным a33ik.

Возникла следующая проблема:
веб-методы, в которых не используется доступ к структуре шарапойнт отрабатывает хорошо
X++:
        [WebMethod]
        public string HelloWorld1(string sitePath, string libName, string folderPath, string fileName, byte[] fileContents)
        {
            SPSite site = new SPSite(sitePath);
            SPWeb web = site.OpenWeb();
            return sitePath;
        }
При небольшом изменении (см. пример ниже) - кидается ошибка
"The HTTP request is unauthorized with client authentication scheme 'Ntlm'. The authentication header received from the server was 'NTLM'."

X++:
        [WebMethod]
        public string HelloWorld1(string sitePath, string libName, string folderPath, string fileName, byte[] fileContents)
        {
            SPSite site = new SPSite(sitePath);
            SPWeb web = site.OpenWeb();
            string libRoot = web.Lists[libName].RootFolder.ServerRelativeUrl.ToString();
            return sitePath;
        }
Приложение sharepoint работает под пользователем domen\user, который является администратором на компьютере, в sharepoint и crm.
ОС: windows 2003, IIS 6.0

Доступ к вебслужбе осуществляется так:

X++:
                BasicHttpBinding bind = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
                EndpointAddress endpoint = new EndpointAddress("http://server:6001/_vti_bin/Files.asmx");
                bind.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
                bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
                bind.SendTimeout = new TimeSpan(0, 1, 0);
                bind.ReceiveTimeout = new TimeSpan(0,10,0);
                bind.OpenTimeout = new TimeSpan(0, 1, 0);
                bind.CloseTimeout = new TimeSpan(0, 1, 0);
                bind.MaxBufferPoolSize = 5524288;
                bind.MaxBufferSize = 565536;
                bind.MaxReceivedMessageSize = 565536;

                SharepointConnector.FilesSoapClient connector = new SharepointConnector.FilesSoapClient(bind, endpoint);
                connector.ClientCredentials.UserName.UserName = @"domen\user";
                connector.ClientCredentials.UserName.Password = "****";
                connector.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;

               [...]
                // Тут валится
                connector.HelloWorld1("http://server:6001", "Библиотека документов", "/Папка1/Папка2/Папка3", "qwe.txt", buffer);
В консольном же приложении все отрабатывает хорошо.
Помогите пожалуйста!
Старый 01.10.2009, 16:17   #8  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
У меня к сожалению нет тестового стенда для такой задачи. Попробуйте исправить такие строку (не ругайте меня сильно - не силён я в WCF):

Код:
bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 02.10.2009, 09:58   #9  
marbatov is offline
marbatov
Участник
 
18 / 10 (1) +
Регистрация: 29.09.2009
Интеграция CRM и Sharepoint через webservice
Цитата:
Сообщение от a33ik Посмотреть сообщение
Код:
bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
Нет, это строка не походит. Пишет, что не может подконнектиться под анонимусом. Все равно спасибо за ответ.

Все таки я смог доделать разработку. На всякий случай выкладываю здесь, может кому пригодится через гугл. Сделал ряд мер (толком не понял какое помогло):
1) Выполнил настройку IIS согласно статье How to configure IIS to support both the Kerberos protocol and the NTLM protocol for network authentication
2) На всякий случай решил эту проблему You receive error 401.1 when you browse a Web site that uses Integrated Authentication and is hosted on IIS 5.1 or a later version
3) Сам код вызова веб-сервиса выглядит так (извиняюсь за качество, версия рабочая) :

X++:
                BasicHttpBinding bind = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
                EndpointAddress endpoint = new EndpointAddress("http://server:6001/_vti_bin/Files.asmx");
                bind.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
                bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
                bind.SendTimeout = new TimeSpan(0, 1, 0);
                bind.ReceiveTimeout = new TimeSpan(0,10,0);
                bind.OpenTimeout = new TimeSpan(0, 1, 0);
                bind.CloseTimeout = new TimeSpan(0, 1, 0);
                bind.MaxBufferPoolSize = 5524288;
                bind.MaxBufferSize = 565536;
                bind.MaxReceivedMessageSize = 565536;
                
                SharepointConnector.FilesSoapClient connector = new SharepointConnector.FilesSoapClient(bind, endpoint);
                connector.ClientCredentials.Windows.ClientCredential.UserName = "user";
                connector.ClientCredentials.Windows.ClientCredential.Domain = "domen";
                connector.ClientCredentials.Windows.ClientCredential.Password = "****";

                connector.ClientCredentials.UserName.UserName = @"domen\user";
                connector.ClientCredentials.UserName.Password = "****";
                connector.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
                connector.ChannelFactory.Credentials.Windows.AllowNtlm = true;
                connector.ChannelFactory.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;

                foreach (annotation note in response.BusinessEntityCollection.BusinessEntities)
                {
                    string attachid = note.annotationid.Value.ToString();
                    string objecttypecode = "1070"; //SaleLiteratureItem
                    string a = connector.HelloWorld("wwww");
                    connector.UploadDocument("http://server:6001", "Библиотека документов", "/Папка1/Папка2/Папка3", note.filename, Convert.FromBase64String(note.documentbody));
                }
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Сообщения, на которые регистрируется плагин Dark_Angel Dynamics CRM: Разработка 2 05.08.2009 14:38
Плагин на обновление slivka_83 Dynamics CRM: Разработка 1 20.07.2009 17:10
Плагин для сущности "встреча" Tony Green Dynamics CRM: Разработка 5 19.05.2009 11:56
Тип сущности, использующей плагин Казарин Александр Dynamics CRM: Разработка 2 02.04.2009 20:29
Как зарегить плагин на смену State? Alir Dynamics CRM: Разработка 8 24.11.2008 12:06

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 13:21.