Dynamics 365附件的常见控制

我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复392或者20200205可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!

我们知道当前版本(我说的是当前,以后可能会更改)Dynamics 365的附件是存储在annotation实体的,是以Base64编码存储的,默认情况下单个附件最大是5兆,可以通过 Settings > Administrator > System Settings > Email查看到如下:

 

 你可能会问最大能设置到多大?Dynamics 365 Customer Engagement V9.X版本是 128MB ,也就是 131072 KB ,之前的版本应该是32MB。

如果强行上传更大的文件会报错,报错如下:

 

 当然也可以限制上传文件类型,比如我限制不能上传zip文件,导航到Settings > Administrator > System Settings > General 进行设置,就是添加 ;zip 。

 

 如果强行上传zip文件的话会报错如下:

 

 有的用户可能想限制某些实体下单条记录上传附件总的大小,比如我这里以限制系统标准的incident实体,每个incident记录关联的附件不能超过10MB。

我使用的代码如下:

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;

namespace PluginDemo
{
    public class PostAnnotationCreate : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            // 获取日志服务
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            //写一些日志,方便跟踪
            tracingService.Trace($"Enter PostAnnotationCreate on {DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss:ms")}");
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
                //插件针对的当前实体记录,对于Pre Create消息来讲,该对象包括了所有设置的字段值
                Entity currentEntity = (Entity)context.InputParameters["Target"];
                //获取系统管理员角色的特殊服务账号代表的组织服务,方便查询出所有数据
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService orgAdminSvc = serviceFactory.CreateOrganizationService(null);
                //只有注释包括附件才做检查
                if (currentEntity.Contains("isdocument") && currentEntity.GetAttributeValue<bool>("isdocument") && currentEntity.Contains("objectid"))
                {
                    tracingService.Trace($"The notes has attachment {DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss:ms")}");
                    var regardingObj = currentEntity.GetAttributeValue<EntityReference>("objectid");
                    tracingService.Trace($"The notes regarding {regardingObj.LogicalName} with id {regardingObj.Id} {DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss:ms")}");
                    if (regardingObj.LogicalName == "incident")
                    {
                        tracingService.Trace($"The notes regarding incident {DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss:ms")}");
                        //通过聚合运算算出当前注释关联case的附件大小,这个计算会包括当前要上传的附件的大小
                        string caseAttachmentSizeSumQuery = string.Format(@"<fetch version='1.0' mapping='logical' no-lock='true' aggregate='true'>
  <entity name='annotation'>
    <attribute name='filesize' alias='filesize_sum' aggregate='sum' />
    <filter type='and'>
      <condition attribute='isdocument' operator='eq' value='1' />
    </filter>
    <link-entity name='incident' from='incidentid' to='objectid' link-type='inner' alias='ab'>
      <filter type='and'>
        <condition attribute='incidentid' operator='eq' value='{0}' />
      </filter>
    </link-entity>
  </entity>
</fetch>", regardingObj.Id);
                        EntityCollection caseAttachmentSizeSum_result = orgAdminSvc.RetrieveMultiple(new FetchExpression(caseAttachmentSizeSumQuery));
                        if (caseAttachmentSizeSum_result.Entities.Count >= 1 && caseAttachmentSizeSum_result.Entities[0].Contains("filesize_sum") && caseAttachmentSizeSum_result.Entities[0]["filesize_sum"] != null && ((AliasedValue)caseAttachmentSizeSum_result.Entities[0]["filesize_sum"]).Value != null)
                        {
                            var caseAttachmentSizeSum = (Int32)((AliasedValue)caseAttachmentSizeSum_result.Entities[0]["filesize_sum"]).Value;
                            tracingService.Trace($"The case has {caseAttachmentSizeSum} bytes of attachment including current attachement {DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss:ms")}");
                            //如果该case下面的附件大小超过了10兆,就不允许继续上传
                            if ((caseAttachmentSizeSum) >= 10 * 1024 * 1024)
                            {
                                throw new InvalidPluginExecutionException("一个Case下的所有附件大小之和不能超过10MB!若要继续上传请减少上传文件大小或者删除已经上传的附件!");
                            }
                        }
                        else
                        {
                            tracingService.Trace($"The notes regarding {regardingObj.LogicalName} with id {regardingObj.Id} does not have attachment {DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss:ms")}");
                        }
                    }
                }
            }
            tracingService.Trace($"Leave PostAnnotationCreate on {DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss:ms")}");
        }
    }
}

 

注册插件如下:

 

 可以看到效果如下:

 

posted @ 2020-02-05 00:42  微软MVP(15-18)罗勇  阅读(864)  评论(0编辑  收藏  举报