zoukankan      html  css  js  c++  java
  • 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")}");
            }
        }
    }

    注册插件如下:

     可以看到效果如下:

  • 相关阅读:
    包装类
    项目基础架构搭建
    开发环境的搭建和Shell编程
    Linux系统概述和编程基础
    java.lang.ExceptionInInitializerError
    mybatis中文文档
    如何造轮子
    Application Server was not connected before run configuration stop, reason: Unable to ping server at localhost:1099
    JDK 1.7与JDK 1.8版本的完美切换
    JDBC连接步骤
  • 原文地址:https://www.cnblogs.com/luoyong0201/p/Dynamics_365_Annotation_Attachment_Control.html
Copyright © 2011-2022 走看看