Хранение любых файлов в Веб-ресурсах
По-хорошему Веб-ресурсы позволяю хранить ограниченный набор типов файлов. Но к счастью, CRM при сохранении файлов в Веб-ресурсе производит проверку только по его расширению – сам контент не проверяется. Поэтому Вы можете изменить расширение любого файла на XML и сохранить его в XML Веб-ресурсе.
После этого можете получить его программно следующим образом:
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; using System.IO; namespace AnyFileType { 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; // Формируем запрос Веб-ресрса QueryExpression query = new QueryExpression() { EntityName = "webresource", ColumnSet = new ColumnSet("content", "displayname"), Criteria = new FilterExpression { FilterOperator = LogicalOperator.And, Conditions = { new ConditionExpression { AttributeName = "name", Operator = ConditionOperator.Equal, Values = { "new_superPDF.pdf" } // Фильтрация по имени } } } }; // Отправляем запрос RetrieveMultipleRequest rmr = new RetrieveMultipleRequest(); rmr.Query = query; RetrieveMultipleResponse resp = (RetrieveMultipleResponse)service.Execute(rmr); Entity wr = resp.EntityCollection.Entities[0]; // Сохраняем файл на диске byte[] filebytes = Convert.FromBase64String(wr["content"].ToString()); FileStream fs = new FileStream(@"c:\test\" + wr["displayname"], FileMode.Create); foreach (byte b in filebytes) { fs.WriteByte(b); } fs.Close(); Console.WriteLine("Файл " + wr["displayname"] + " сохранен на диске."); Console.WriteLine("Press <Enter> to exit."); Console.ReadLine(); } } }
Здесь мы делаем следующее:
- Подключаемся к CRM;
- Формируем запрос на возвращение определенного Веб-ресурса (отбираем его по имени);
- Выполняем запрос и получаем результат;
- Из пришедших имени файла и контента создаем файл на локальном диске.