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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.11.2010, 00:51   #1  
Dicora is offline
Dicora
Участник
 
109 / 15 (1) ++
Регистрация: 12.07.2010
Вытащить приаттаченные файлы из 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="&amp;CRMWRPCToken=e0GDXOMxEd%2b7cAAwSL5zLYi1nc0zLu8zyT7PKCtqj%2bgRbiPPRbvx5t1VVY8eEVZl&amp;CRMWRPCTokenTimeStamp=634257120771013998"><img alt="" src="/_imgs/attachments/16_generic.gif" align="absmiddle" border="0">&nbsp;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  
Dicora is offline
Dicora
Участник
 
109 / 15 (1) ++
Регистрация: 12.07.2010
Если запустить этот скрипт без конфига вообще получаем такую ошибку:

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}
т.е. в папке Files

веб конфиг отсутствует.

в чем ошибка подскажите пожалуйста.
Было бы очень хорошо отладить этот скрипт чтобы не придумывать решение проблемы с нуля.
Старый 19.11.2010, 01:09   #3  
Dicora is offline
Dicora
Участник
 
109 / 15 (1) ++
Регистрация: 12.07.2010
А если в папку 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  
Bondonello is offline
Bondonello
Kostya Afendikov
Аватар для Bondonello
MCBMSS
Лучший по профессии 2009
 
510 / 106 (5) +++++
Регистрация: 06.06.2008
Адрес: Украина
1. Вы просто создали aspx страницу?
2.
Цитата:
я создал в корневой папке этот скрипт
- в корневой папке веб-сайта CRM?
3. какой веб-конфиг вы изменили?

Я предполагаю, что автор блога делал следующие шаги:
1. Создавал новый веб-сайт
2. Публиковал данный веб-сайт в папке CRM_Server\ISV\ваш_веб-сайт
3. изменял веб-конфиг своего созданного веб-сайта.

Попробуйте эти шаги.
Думаю, что slivka_83 завтра все расскажет
Старый 19.11.2010, 09:52   #5  
slivka_83 is offline
slivka_83
Консультант-джедай
Аватар для slivka_83
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
1,683 / 374 (16) ++++++
Регистрация: 18.12.2008
Адрес: default city
Цитата:
Сообщение от Bondonello Посмотреть сообщение
Я предполагаю, что автор блога делал следующие шаги:
1. Создавал новый веб-сайт
2. Публиковал данный веб-сайт в папке CRM_Server\ISV\ваш_веб-сайт
3. изменял веб-конфиг своего созданного веб-сайта.
угу все верно
__________________
Крокодил, крокожу и буду крокодить.
Человек человеку - волк , а зомби зомби - зомби.
Экстремал и буду экстремать!
Блога
Старый 19.11.2010, 10:25   #6  
Dicora is offline
Dicora
Участник
 
109 / 15 (1) ++
Регистрация: 12.07.2010
В корневой папке 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  
Dicora is offline
Dicora
Участник
 
109 / 15 (1) ++
Регистрация: 12.07.2010
И обязательно ли создавать новую папку в ISV или можно в любом месте??
И ошибка может быть из-за отсутствия .aspx.cs и папки bin?
за что они отвечают и как мне их создать??

Заранее спасибо!
Старый 19.11.2010, 10:42   #8  
slivka_83 is offline
slivka_83
Консультант-джедай
Аватар для slivka_83
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
1,683 / 374 (16) ++++++
Регистрация: 18.12.2008
Адрес: default city
Цитата:
Сообщение от Dicora Посмотреть сообщение
И обязательно ли создавать новую папку в ISV или можно в любом месте??
И ошибка может быть из-за отсутствия .aspx.cs и папки bin?
за что они отвечают и как мне их создать??

Заранее спасибо!
Если в кратце то да если кастомный сайт размещается внутри CRM то обязательно в ISV.

Никаких файлов создавать ручками не нужно - только папку в которой они будут размещаться. Затем, после создания сайта в VS, перейдите Build - Publish Web Site - и укажите путь куда будет публиковаться сайт.
__________________
Крокодил, крокожу и буду крокодить.
Человек человеку - волк , а зомби зомби - зомби.
Экстремал и буду экстремать!
Блога
За это сообщение автора поблагодарили: Dicora (1).
Старый 22.11.2010, 08:13   #9  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Бегло прочитал тему и, как мне показалось не на все вопросы были даны ответы.
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  
Dicora is offline
Dicora
Участник
 
109 / 15 (1) ++
Регистрация: 12.07.2010
Решение заработало, спасибо огромное slivka_83

Цитата:

Необходимо поменять название организации в исходниках.
Поэтому высылаю исходники:
архив: http://zalil.ru/30007683

Открываешь их в VS2008 и правишь название организации на свое.
Затем создаешь в папке ISV подпапку "dla".
Из VS публикуешь (Build - Publish Web Site) проект в эту папку.

Ну и чтобы скатать какой-нибудь приаттаченый файл вызываешь такую урлу
http://<имя_сервера>/isv/dla/default.aspx?guid=<guid_приаттаченного _файла>
Если файл не скачается, прилагаю архив:


Если кто-то захочет вытащить вложенный файл из примечаний по запросу - пользуйтесь этим решением. Спасибо всем кто помогал!
Вложения
Тип файла: zip WebSite2.zip (2.3 Кб, 104 просмотров)
Старый 22.11.2010, 12:34   #11  
Bondonello is offline
Bondonello
Kostya Afendikov
Аватар для Bondonello
MCBMSS
Лучший по профессии 2009
 
510 / 106 (5) +++++
Регистрация: 06.06.2008
Адрес: Украина
Т.е. все заработало сразу, если бы вы внимательно прочли статью slivka_83 и не начали паниковать.
Теги
crm, аннотации, вложения, выгрузка файлов, приаттаченные файлы, прикрепление файла, примечания

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
CRM DE LA CREME! CRM 4.0 Disaster Recovery Blog bot Dynamics CRM: Blogs 2 26.02.2016 08:23
Все о Microsoft Dynamics CRM: Как установить Microsoft Dynamics CRM 2011 Beta Blog bot Dynamics CRM: Blogs 0 31.10.2010 15:08
CRM DE LA CREME! Configuring Microsoft Dynamics CRM 4.0 for Internet-facing deployment Blog bot Dynamics CRM: Blogs 0 18.08.2009 11:05
Microsoft Dynamics CRM Team Blog: Building Rich-Client Dashboards for Microsoft Dynamics CRM with Windows Presentation Foundation Blog bot Dynamics CRM: Blogs 1 31.03.2009 13:24
Microsoft Dynamics CRM Team Blog: List Web Part for Microsoft Dynamics CRM 4.0 Deployment Scenarios Blog bot Dynamics CRM: Blogs 0 30.01.2009 22:05

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

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

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