【问题标题】:Getting a security exception while loading xml in CRM 2013在 CRM 2013 中加载 xml 时出现安全异常
【发布时间】:2014-10-10 18:07:18
【问题描述】:

我正在处理 CRM 2013 中的自定义活动工作流。我的工作流访问一个 xml 文件。当我部署我的工作流程并运行它时,它会引发错误;

未处理的异常:Microsoft.Crm.CrmException:意外异常 从插件(执行):MyProj.WorkFlows.ReadXML: System.Security.SecurityException:请求类型的权限 'System.Security.Permissions.FileIOPermission, mscorlib, 版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089' 失败了。

我写的代码是这样的;

public string GetBookAuthor(string key, string bookId)
        {
            string fileName = @"books.xml";
            XmlTextReader reader = new XmlTextReader(fileName);
            XmlDocument doc = new XmlDocument();
            doc.Load(reader);
            reader.Close();

            XmlNode bookAuthor;
            if (doc != null)
            {
                XmlElement root = doc.DocumentElement;
                if (root != null)
                {
                    bookAuthor= root.SelectSingleNode("/books/book[@key='" + key + "']/Author[@bookId='" + bookId + "']");
                    if (bookAuthor!= null)
                        return bookAuthor.InnerText;
                    return string.Empty;
                }
                return string.Empty;
            }
            return string.Empty;
        }

【问题讨论】:

    标签: c#-4.0 dynamics-crm crm dynamics-crm-2013


    【解决方案1】:

    只有在沙盒之外注册的自定义工作流活动才能访问文件系统。

    此外,允许自定义工作流活动或插件使用文件系统不是最佳做法,最好使用 Web 资源或 Web 服务来存储/处理文件。

    【讨论】:

    • 如果该文件存在于网络资源中,我可以访问它吗?
    • 是的,您可以在自定义工作流活动中读取网络资源内容
    • 你能帮帮我吗?我正在尝试通过 Google 搜索它,但不确定我的方向是否正确。
    【解决方案2】:

    (请注意,以下内容适用于任何程序集:自定义活动、插件...)

    如果您想遵循 100% 受支持的方法以便留在沙盒中,那么您绝不能离开 CRM“环境”。这意味着:没有文件系统访问、没有调用外部 Web 服务(更多内容见下文)、没有 SQL 查询等。

    要在您的情况下实现这一点,很容易:

    1. 将您的 XML 文件作为 Web 资源存储在 CRM 中(记下唯一名称,您将需要它)
    2. 在您的代码中,将您访问文件系统的部分更改为WebResource 实体上的QueryExpression。网络资源的内容将采用 Base64 编码,因此您有一个额外的环可以跳过以获取原始文本。
    var filename = "your_web_resource_unique_name_here"; XmlDocument 文档 = 新 XmlDocument(); var xmlQuery = new QueryExpression("WebResource") { ColumnSet = new ColumnSet("内容"), Criteria = new FilterExpression(LogicalOperator.And) { 条件 = { new ConditionExpression("Name", ConditionOperator.Equal, 文件名) } } }; var xmlEncoded = organizationService.RetrieveMultiple(xmlQuery).First().GetAttributeValue("Content"); var xmlPlain = Encoding.UTF8.GetString(Convert.FromBase64String(xmlEncoded)); doc.LoadXml(xmlPlain);
    1. doc 已填满并准备就绪

    关于外部 Web 服务,据称它是受支持的,但数据传输很容易被误认为是过载(并且平台会杀死工作进程)。这可能会导致插件执行随机失败,从而导致客户“没有任何效果!”支持票...

    【讨论】:

    • 在沙箱内允许并支持访问外部 Web 服务。有一些限制,它们在此处进行了描述:msdn.microsoft.com/en-us/library/gg334752.aspx
    • 没错,但执行起来似乎非常严格:If the sandbox worker process that hosts this custom code exceeds threshold CPU, memory, or handle limits or is otherwise unresponsive, that process will be killed by the platform。有几次我试图将一些数据传输到平台外部/从平台外部传输到我的程序集上......
    • 好吧,我们对此有不同的体验:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2019-12-10
    相关资源
    最近更新 更多