|
19.11.2010, 00:51 | #1 |
Участник
|
Вытащить приаттаченные файлы из CRM по запросу
Такой вопрос,
в CRM в примечаниях можно вкладывать вложения, после чего они сохраняются в таблице AnnotationBase. Что характерно как-то странно они там сохраняются т.к. непонятно в базе они хранятся или на сервере. Мои предположения где может храниться файл: На сервере В этом случае в базе в таблице в одной из колонок должна быть сохранена ссылка на файл или его идентификатор чтобы можно было его потом найти и подгрузить. Облазил всю базу CRM и не нашел ни одной ссылки. кроме 2х интересных полей: MimeType, DocumentBody Причем хочу заметить что если в MimeType заголовок файла сохранен, то в DocumentBody содержимое файла не сохранено, т.к. если бы содержимое всех файлов в закодированном виде хранилось в этой колонке тип её был бы как минимум BLOB, а длинна содержимого различных файлов (по размеру) должна отличаться. Содержимое же колонки DocumentBody для файлов разных размеров одинаковое (по длинне символов) что наводит на странные мысли. Значит это ссылка либо какой-то идентификатор. Вопрос какой? и где его применить? Идем дальше.. Открыл форму с примечаниям (точнее код IFRAME содержащее примечания) с вложенным файлом и через IE Developer ToolBar выцепляю код слоя с фалом примечания, т.к. при клике у меня открывается файл - значит истоки места откуда эти файлы скачиваются нужно здесь. Нахожу такой код X++: <span class="attachment" title="Щелкните для открытия" attachmentId="{FF896FAA-59F3-DF11-BB70-003048BE732D}" attachmentType="5" merchantId="{E07FE863-0126-DF11-A3C0-003048BE732D}" userId="{A0CB17C4-AD26-DF11-9050-003048BE732D}" url="/OrgName/Activities/Attachment/download.aspx"" WRPCTokenUrl="&CRMWRPCToken=e0GDXOMxEd%2b7cAAwSL5zLYi1nc0zLu8zyT7PKCtqj%2bgRbiPPRbvx5t1VVY8eEVZl&CRMWRPCTokenTimeStamp=634257120771013998"><img alt="" src="/_imgs/attachments/16_generic.gif" align="absmiddle" border="0"> 833.rtf</span><span class="ms-crm-Attachment-SizeSpacer"></span> 1) Путь к странице с которой скачиваются файлы: /OrgName/Activities/Attachment/download.aspx - уже хорошо. Осталось определиться с параметрами которые нужно передать на этот скрипт, чтобы получить файл: 2) Напрашивается GUID примечания (AnnotationId) из таблицы AnnotationBase {FF896FAA-59F3-DF11-BB70-003048BE732D} в форме аттрибут AttachmentId 3) Также Тип объекта (по нашему сущности в примечании которой мы работаем) 5 (колонка ObjectTypeCode из этой же таблицы) в форме аттрибут AttachmentType 4) GUID Пользователя (либо того который открывает примечание либо того кто его создал), в данном случае в обеих ролях выступаю я один поэтому это сейчас не важно: {A0CB17C4-AD26-DF11-9050-003048BE732D} в базе Колонка OwningUser в форме аттрибут UserId 5) за что отвечает аттрибут merchantId на форме - я так и не разобраля, т.к. GUID объекта сущности организации по отношению к которой я создавал примечание отличается от всех GUID-ов используемых в форме. 6) Два неизвестных аттрибута: а) CRMWRPCToken=e0GDXOMxEd%2b7cAAwSL5zLYi1nc0zLu8zyT7PKCtqj%2bgRbiPPRbvx5t1VVY8eEVZl б) CRMWRPCTokenTimeStamp=634257120771013998 Как они генерируются и где используюся мне понять не удалось. Теперь собственно развязка: Если запустить этот URL и передать в него все эти параметры - файл не открывается!!! Т.е. Алгоритм и механизм по которой по клику на вложенный файл в примечании CRM выдает закачанный файл для скачки - не понятен. Также не понятно как генерировать эти Токены в случае если нужно создать страницу, в которую хотелось бы передавать просто GUID аннотации (примечания) и чтобы в ответ предлагалось скачать файл. Похожее решение я нашел вот тут: http://mmcrm.ru/?p=1138 Я не буду цитировать весь код, только важную инфу: Нужен этот код: X++: using System; using System.Configuration; using System.Data; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using Microsoft.Crm.Sdk; using Microsoft.Crm.Sdk.Query; using Microsoft.Crm.SdkTypeProxy; using System.Net; using System.Collections.Generic; using System.Text; using System.IO; using System.Web.Services.Protocols; using Microsoft.Win32; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { try { // Выполняем код под юзвером открывашем страницу using (new CrmImpersonator()) { // Проверяем что через URL передан параметр guid, иначе прекращаем выполнение if (Request.QueryString["guid"] == null) return; // Настраиваем CRM Service CrmAuthenticationToken token = CrmAuthenticationToken.ExtractCrmAuthenticationToken(Context, "superfirma"); CrmService service = new CrmService(); service.CrmAuthenticationTokenValue = token; service.UseDefaultCredentials = true; // Вытаскиваем имя СRM сервера из регистра Windows service.Url = (string)(Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\MSCRM").GetValue("ServerUrl")) + "/2007/crmservice.asmx"; // Кэшируем credentials, чтобы каждый запрос не проходил повторно аутентификацию service.PreAuthenticate = true; // Запрашиваем примечание с GUID'ом переданным через URL Guid annotationId = new Guid(Request.QueryString["guid"]); // Нам нужны следующие колонки: имя файла, содержимое файло и его тип ColumnSet cols1 = new ColumnSet(); cols1.Attributes.Add("filename"); cols1.Attributes.Add("documentbody"); cols1.Attributes.Add("mimetype"); // Отправляем запрос в CRM Service annotation annotationAttachment = (annotation)service.Retrieve(EntityName.annotation.ToString(), annotationId, cols1); // Перекодируем содержимое файла хранящееся в БД CRM из кодировки Base64 в byte... byte[] fileContent = Convert.FromBase64String(annotationAttachment.documentbody); // ... а из byte в string string s = System.Text.Encoding.Default.GetString(fileContent); // Обнуляем изначальный ответ и возвращяем ответ в виде файла Response.ClearContent(); Response.AddHeader("content-disposition", "attachment; filename=" + annotationAttachment.filename); Response.ContentType = annotationAttachment.mimetype; Response.BinaryWrite(fileContent); Response.End(); } } catch (SoapException sexc) { throw new Exception(sexc.Detail.InnerText); } catch (Exception ex) { throw new Exception(ex.Message); } } } по мнению автора если передать в этот скрипт GUID вернуться должен приаттаченный файл, я создал в корневой папке этот скрипт. Передаю туда GUID влоенного файла в CRM и получаю ошибку - файл не скачиваетя. Возможно из-за неверных настроек web.config, т.к. из статьи не понятно каким образом нужно внести эти добавления в существующий конфиг, всё удалить и вставить этот маленький кусочек: X++: <?xml version="1.0"?> <configuration> <appSettings/> <connectionStrings/> <system.web> <httpModules> <add name="MapOrg" type="Microsoft.Crm.MapOrgEngine, Microsoft.Crm, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <add name="CrmAuthentication" type="Microsoft.Crm.Authentication.AuthenticationEngine, Microsoft.Crm, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </httpModules> <identity impersonate="true"/> <compilation debug="true"> <assemblies> <add assembly="Microsoft.Crm.Sdk, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="Microsoft.Crm.SdkTypeProxy, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </assemblies> </compilation> </system.web> </configuration> Подскажите пожалуйста как мне решить эту задачу с выгрузкой приаттаченных файлов из CRM по запросу? Заранее спасибо! |
|
19.11.2010, 01:02 | #2 |
Участник
|
Если запустить этот скрипт без конфига вообще получаем такую ошибку:
X++: Microsoft CRM Error Report: Error Description: CS1513: } expected Error Details: c:\Program Files\Microsoft Dynamics CRM\CRMWeb\Files\notes.aspx(19): error CS1513: } expected Full Stack: [HttpCompileException: c:\Program Files\Microsoft Dynamics CRM\CRMWeb\Files\notes.aspx(19): error CS1513: } expected] at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath) at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean noAssert) at System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp, Boolean noAssert) at System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath) at System.Web.UI.PageHandlerFactory.System.Web.IHttpHandlerFactory2.GetHandler(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath) at System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, VirtualPath path, String pathTranslated, Boolean useAppConfig) at System.Web.HttpApplication.MapHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) Other Message: Error Number: Source File: c:\Program Files\Microsoft Dynamics CRM\CRMWeb\Files\notes.aspx Line Number: 19 Date: 11-19-2010 Time: 01:00:58 Server: crmsrv02 Request URL: http://crmsrv02:5555/Files/notes.aspx?guid={07A71E60-2EF3-DF11-BB70-003048BE732D} веб конфиг отсутствует. в чем ошибка подскажите пожалуйста. Было бы очень хорошо отладить этот скрипт чтобы не придумывать решение проблемы с нуля. |
|
19.11.2010, 01:09 | #3 |
Участник
|
А если в папку Files
скопировать конфиг CRM-а 4.0 То получаем такую ошибку X++: Server Error in '/' Application. -------------------------------------------------------------------------------- Configuration Error Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately. Parser Error Message: It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS. Source Error: Line 50: </assemblies> Line 51: </compilation> Line 52: <authentication mode="Windows" /> Line 53: <identity impersonate="true" /> Line 54: Source File: C:\Program Files\Microsoft Dynamics CRM\CRMWeb\files\web.config Line: 52 Show Additional Configuration Errors: It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS. (C:\Program Files\Microsoft Dynamics CRM\CRMWeb\files\web.config line 57) -------------------------------------------------------------------------------- Version Information: Microsoft .NET Framework Version:2.0.50727.3615; ASP.NET Version:2.0.50727.3614 |
|
19.11.2010, 01:44 | #4 |
Kostya Afendikov
|
1. Вы просто создали aspx страницу?
2. Цитата:
я создал в корневой папке этот скрипт
3. какой веб-конфиг вы изменили? Я предполагаю, что автор блога делал следующие шаги: 1. Создавал новый веб-сайт 2. Публиковал данный веб-сайт в папке CRM_Server\ISV\ваш_веб-сайт 3. изменял веб-конфиг своего созданного веб-сайта. Попробуйте эти шаги. Думаю, что slivka_83 завтра все расскажет |
|
19.11.2010, 09:52 | #5 |
Консультант-джедай
|
угу все верно
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
19.11.2010, 10:25 | #6 |
Участник
|
В корневой папке CRM
а именно c:\Program Files/Microsoft Dynamics CRM/CRM_Web я создал папку Files в ней создал файл notes.aspx и web.config с тем содержимым что указано на сайте mmcrm.ru X++: Microsoft CRM Error Report: Error Description: CS1513: } expected Error Details: c:\Program Files\Microsoft Dynamics CRM\CRMWeb\Files\notes.aspx(19): error CS1513: } expected ПО сути в папке Files у меня 2 файла (ваш веб.конфиг и aspx страница к которой я обращаюсь) Вопрос, там написано ещё про какой то Default.aspx.cs (что за CS??) и папку bin и прочее, этого у меня нет. Т.к. моя Visual Studio 2008 при сохранении Defaults.aspx и web.config выдает 96 Errors и не дает компилировать. Поэтому скрипт notes.aspx - свой я писал в блокноте, как и веб.конфиг. Последний раз редактировалось Dicora; 19.11.2010 в 10:28. |
|
19.11.2010, 10:32 | #7 |
Участник
|
И обязательно ли создавать новую папку в ISV или можно в любом месте??
И ошибка может быть из-за отсутствия .aspx.cs и папки bin? за что они отвечают и как мне их создать?? Заранее спасибо! |
|
19.11.2010, 10:42 | #8 |
Консультант-джедай
|
Цитата:
Никаких файлов создавать ручками не нужно - только папку в которой они будут размещаться. Затем, после создания сайта в VS, перейдите Build - Publish Web Site - и укажите путь куда будет публиковаться сайт.
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
|
За это сообщение автора поблагодарили: Dicora (1). |
22.11.2010, 08:13 | #9 |
Moderator
|
Бегло прочитал тему и, как мне показалось не на все вопросы были даны ответы.
1. Файлы хранятся в БАЗЕ! Весь контент системы CRM 4.0 кроме страниц расширения хранится в базе и нигде кроме. 2. Токены про которые вы говорите используются каким-то недокументированным механизмом безопасности. Если вы хотите чтобы ваше решение вообще когда-нибудь заработало (хотя лично я в этом не уверен) то проверку токенов нужно отключить: https://community.dynamics.com/produ....aspx#comments 3. Когда учатся программировать, читают книги, а не пишут на форумы. Может быть и вам попробовать? А то у меня складывается ощущение, что мы тут скоро отлаживаться по шагам будем вместе с вами?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
22.11.2010, 10:31 | #10 |
Участник
|
Решение заработало, спасибо огромное slivka_83
Цитата:
Необходимо поменять название организации в исходниках. Поэтому высылаю исходники: архив: http://zalil.ru/30007683 Открываешь их в VS2008 и правишь название организации на свое. Затем создаешь в папке ISV подпапку "dla". Из VS публикуешь (Build - Publish Web Site) проект в эту папку. Ну и чтобы скатать какой-нибудь приаттаченый файл вызываешь такую урлу http://<имя_сервера>/isv/dla/default.aspx?guid=<guid_приаттаченного _файла> Если кто-то захочет вытащить вложенный файл из примечаний по запросу - пользуйтесь этим решением. Спасибо всем кто помогал! |
|
22.11.2010, 12:34 | #11 |
Kostya Afendikov
|
Т.е. все заработало сразу, если бы вы внимательно прочли статью slivka_83 и не начали паниковать.
|
|
Теги |
crm, аннотации, вложения, выгрузка файлов, приаттаченные файлы, прикрепление файла, примечания |
|
|