Разработка
16
Окт
4

Загрузка вложений

Допустим, требуется выгрузит из CRM вложенные в него файлы. Стандартных средств выгрузки нету, хотя есть стандартные средства загрузки. Восполним этот недостаток. Вот код небольшого консольного приложения, которое выгружает все файлы приаттаченные к записям CRM:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Client;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Runtime.Serialization;

namespace SaveFile
{
    class Program
    {
        static void Main(string[] args)
        {
            // Подключаемся к CRM
            ClientCredentials credentials = new ClientCredentials();
            credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1qaz@WSX", "D2011");
            Uri uri = new Uri("http://crm2011:5555/superfirma/XRMServices/2011/Organization.svc");
            OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null);
            proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
            IOrganizationService service = (IOrganizationService)proxy;

            // Запрос всех примечание хранящий файл
            QueryByAttribute query = new QueryByAttribute();
            query.ColumnSet = new ColumnSet("filename", "documentbody");
            query.EntityName = "annotation";
            query.Attributes.AddRange("isdocument");
            query.Values.AddRange(true);

            // Выполняем запрос
            EntityCollection retrievedAnnotation = service.RetrieveMultiple(query);

            // Просматриваем возвращенные примечания
            foreach(Entity Annotation in retrievedAnnotation.Entities)
            {
                Console.WriteLine(Annotation.Attributes["filename"]);

                // Формируем путь сохранения файла
                string outputFileName = @"C:\test\" + Annotation.Attributes["filename"];

                // Сохраняем файл на диск
                byte[] fileContent = Convert.FromBase64String(Annotation.Attributes["documentbody"].ToString());
                System.IO.File.WriteAllBytes(outputFileName, fileContent);
            }

            Console.WriteLine("\nPress <Enter> to exit.");
            Console.ReadLine();  
        }
    }
}

Этот код делает следующее:

  • Подключается к CRM;
  • Формирует и выполняет запрос всех примечаний, с типом вложение;
  • Просматривает все возвращенные файлы и сохраняет их в папке на локальном диске.



Комментарии (4)
  • Dmitry 16.10.2012

    Добрый день

    а как в срм увеличить мах размер загружаемого вложения (принимаемого сервисом стрима)

  • slivka_83 16.10.2012

    Здрасьте.

    Параметры — Администрирование — Системные параметры — вкладка Электронная почта — в самом низу страницы.

    З.Ы. Про сервис стрима не понял…

  • Dmitry 16.10.2012

    например
    надо импортировать солюшен —
    yte[] fileBytes = File.ReadAllBytes(ManagedSolutionLocation);

    impSolReq = new ImportSolutionRequest()
    {
    CustomizationFile = fileBytes,
    ImportJobId = Guid.NewGuid()
    };

    _serviceProxy.Execute(impSolReq);

    по умолчанию размер солюшена не прившает 6 MB
    если импортировать через сервис. если через веб-фейс то можно больше — похоже фейс не использует сервис импорта

    если верить мсдн — увеличить размер сообщения принимаемого сервисом можно в web.config — maxRequestLength
    однако на практике что-то это не работает
    возможно была аналог проблема?

  • slivka_83 16.10.2012

    Если не ошибаюсь в вебконфиге нужно увеличить два параметра:
    — executionTimeout
    — maxRequestLength

*

code