CRM и RSS
Давным-давно, в далекой-далекой галактике корпорация Microsoft выпустила акселератор Notifications 🙂 Этот акселератор позволял самым обычным юзверам подписываться на RSS-ленты, данные для которых формировались на основе представлений. И тем самым быть в курсе последний событий в CRM системе 🙂 А если объединить его с некоторыми бесплатными RSS-читалками (например, Feedreader), то можете получить почти полноценную систему уведомлений 🙂 Но самое главное заключается в том, то что формат RSS является открытым (и весьма распространенным), что позволяет Вам создавать свои собственные RSS-ленты и оформлять их как Вам вздумается. Рассмотрим небольшой такой пример…
Задача: создать RSS-ленту, в которую включить все Контакты CRM-системы!
- Откройте Visual Studio и создайте новый web-сайт: File — New — Web Site. В открывшемся диалоговом окне укажите место расположения, а в качестве языка выберите C#. Ок;
- Подключите SDK’ашные сборки;
- На странице Default.aspx.cs добавьте такой код:
using System; using System.Web.UI; using System.Xml; using Microsoft.Crm.Sdk; using Microsoft.Crm.SdkTypeProxy; using Microsoft.Crm.Sdk.Query; using System.Net; using System.Text; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //string UserId = Request["uid"]; //if (String.IsNullOrEmpty(UserId)) return; // Настраиваем CRM Service CrmAuthenticationToken token = new CrmAuthenticationToken(); token.AuthenticationType = 0; //AD token.OrganizationName = "superfirma"; // Выполняем запрос в контексте какого-либо юзвера //token.CallerId = new Guid(UserId); CrmService crmService = new CrmService(); crmService.CrmAuthenticationTokenValue = token; crmService.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; // Очищаем ответ (страницы) Response.Clear(); Response.ContentType = "text/xml"; XmlTextWriter xtwFeed = new XmlTextWriter(Response.OutputStream, Encoding.UTF8); xtwFeed.WriteStartDocument(); // Создаем корневой элемент RSS xtwFeed.WriteStartElement("rss"); xtwFeed.WriteAttributeString("version", "2.0"); // Создаем новую ленту xtwFeed.WriteStartElement("channel"); xtwFeed.WriteElementString("title", "Новые Контакты"); xtwFeed.WriteElementString("link", "http://win-n22hj23d1b1/superfirma/loader.aspx"); xtwFeed.WriteElementString("ttl", "5"); xtwFeed.WriteElementString("description", "Microsoft Dynamics CRM"); xtwFeed.WriteElementString("copyright", "Copyright Microsoft"); // Создаем объект запроса QueryExpression QueryExpression query = new QueryExpression(); query.EntityName = EntityName.contact.ToString(); // Указываем какие поля необходимо вернуть ColumnSet cols = new ColumnSet(); cols.AddColumn("fullname"); cols.AddColumn("firstname"); cols.AddColumn("lastname"); cols.AddColumn("middlename"); cols.AddColumn("emailaddress1"); cols.AddColumn("telephone1"); cols.AddColumn("createdon"); cols.AddColumn("contactid"); cols.AddColumn("createdby"); query.ColumnSet = cols; // Выполняем запрос в CRM RetrieveMultipleRequest retrieve = new RetrieveMultipleRequest(); retrieve.Query = query; RetrieveMultipleResponse retrieved = (RetrieveMultipleResponse)crmService.Execute(retrieve); BusinessEntityCollection contacts = retrieved.BusinessEntityCollection; // Просматриваем полученный результат foreach (contact contact in contacts.BusinessEntities) { // Формируем основное содержимое string content = null; content += "<table>"; content += "<tr><td style='background-color: #9ACD32'>Имя</td><td>" + contact.firstname + "</td></tr>"; content += "<tr><td style='background-color: #9ACD32'>Фамилия</td><td><b>" + contact.lastname + "</b></td></tr>"; content += "<tr><td style='background-color: #9ACD32'>Отчество</td><td>" + contact.middlename + "</td></tr>"; content += "<tr><td style='background-color: #9ACD32'>Должность</td><td>" + contact.jobtitle + "</td></tr>"; content += "<tr><td style='background-color: #9ACD32'>Телефон</td><td>" + contact.telephone1 + "</td></tr>"; content += "<tr><td style='background-color: #9ACD32'>E-mail</td><td>" + contact.emailaddress1 + "</td></tr>"; content += "</table>"; // Создаем одно сообщение RSS-ленты xtwFeed.WriteStartElement("item"); xtwFeed.WriteElementString("title", contact.fullname); xtwFeed.WriteElementString("description", content); xtwFeed.WriteElementString("link", "http://win-n22hj23d1b1/superfirma/sfa/conts/edit.aspx?id=" + contact.contactid.Value.ToString()); xtwFeed.WriteElementString("pubDate", contact.createdon.UserTime.ToString()); xtwFeed.WriteElementString("author", contact.createdby.name); //xtwFeed.WriteElementString("category", "category1"); xtwFeed.WriteEndElement(); } // Закрвыаем все теги xtwFeed.WriteEndElement(); xtwFeed.WriteEndElement(); xtwFeed.WriteEndDocument(); xtwFeed.Flush(); xtwFeed.Close(); Response.End(); } }
Логика работы такова:
- Подключаемся к CRM Service’у;
- Создаем узел-заголовок для всего документа и для новой RSS-ленты;
- Затем запрашиваем в CRM все Контакты;
- Просматриваем все полученные Контакты и формируем из них сообщения RSS-ленты;
- Закрываем теги заголовка документа и RSS-ленты.
- На страницу web.config поместите следующий код:
<?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>
- Публикуем сайт: в VS перейдите Build — Publish Web Site и укажите путь к папке <сайт CRM>\ISV\rss (ее Вам нужно предварительно создать);
- На этом все. Открываем страницу http://<сервер CRM>/isv/rss/default.aspx в браузере и смотрим на новенькую RSS-ленту 🙂