29.09.2009, 16:02 | #1 |
Участник
|
Плагин (при сохранении копирование вложений)
Пишу свой первый плагин. Необходима след. функциональность: при сохранении какой либо 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; |
|
29.09.2009, 16:08 | #2 |
Чайный пьяница
|
Цитата:
Сообщение от 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; Как загрузить из CRM вложение. Как получить вложения сущности.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: marbatov (1). |
29.09.2009, 16:18 | #3 |
Участник
|
Цитата:
|
|
30.09.2009, 15:52 | #4 |
Участник
|
Следующая проблема
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 |
Чайный пьяница
|
Цитата:
Сообщение от 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 |
Участник
|
Попробовал сделать через ручное указание 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 |
Участник
|
Проблема решилась - появилась новая
Получилось вызвать самые простые веб-матоды моего веб-сервиса способом, подсказанным 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; } ОС: 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 |
Чайный пьяница
|
У меня к сожалению нет тестового стенда для такой задачи. Попробуйте исправить такие строку (не ругайте меня сильно - не силён я в WCF):
Код: bind.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
02.10.2009, 09:58 | #9 |
Участник
|
Интеграция CRM и Sharepoint через webservice
Цитата:
Все таки я смог доделать разработку. На всякий случай выкладываю здесь, может кому пригодится через гугл. Сделал ряд мер (толком не понял какое помогло): 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)); } |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Сообщения, на которые регистрируется плагин | 2 | |||
Плагин на обновление | 1 | |||
Плагин для сущности "встреча" | 5 | |||
Тип сущности, использующей плагин | 2 | |||
Как зарегить плагин на смену State? | 8 |
|