C# 如何解决Dynamics CRM插件System.Security.Permissions.FileIOPermission错误

C# 如何解决Dynamics CRM插件System.Security.Permissions.FileIOPermission错误,c#,plugins,dynamics-crm,crm,dynamics-crm-2013,C#,Plugins,Dynamics Crm,Crm,Dynamics Crm 2013,业务流程错误 System.Security.SecurityException:请求类型为“System.Security.Permissions.FileIOPermission”的权限失败,mscorlib,版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089”。 在System.Security.CodeAccessSecurityEngine.Check(对象请求、堆栈爬网标记和堆栈标记、布尔isPermSet) 在System.Secur

业务流程错误 System.Security.SecurityException:请求类型为“System.Security.Permissions.FileIOPermission”的权限失败,mscorlib,版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089”。 在System.Security.CodeAccessSecurityEngine.Check(对象请求、堆栈爬网标记和堆栈标记、布尔isPermSet) 在System.Security.CodeAccessPermission.Demand()中 在System.IO.FileStream.Init(字符串路径、文件模式、文件访问权限、Int32权限、布尔用户权限、文件共享、Int32缓冲大小、文件选项选项、安全属性secAttrs、字符串msgPath、布尔bFromProxy、布尔useLongPath、布尔checkHost) 位于System.IO.FileStream..ctor(字符串路径、文件模式、文件访问访问、文件共享、Int32 bufferSize、文件选项选项、字符串msgPath、布尔bFromProxy、布尔useLongPath、布尔checkHost) 位于System.IO.File.InternalWriteAllBytes(字符串路径,字节[]字节,布尔校验主机) 在RetrieveAttachments.RetrieveClass.Execute处执行(IServiceProvider服务提供程序) 失败的操作是: 需要 第一个失败的权限的类型是: System.Security.Permissions.FileIOPermission 失败的程序集区域为: 我的计算机

我还在pluginassemblyinfo.cs文件中添加了以下方法 [程序集:System.Security.AllowPartiallyTrustedCallers] 但它也会引起同样的错误

QueryExpression notes = new QueryExpression { EntityName = "annotation", ColumnSet = new ColumnSet("filename", "subject", "annotationid", "documentbody","mimetype") };
notes.Criteria.AddCondition("annotationid", ConditionOperator.Equal, annotationid);
     EntityCollection NotesRetrieve = service.RetrieveMultiple(notes);
     if (NotesRetrieve != null && NotesRetrieve.Entities.Count > 0)
     {
      foreach (var note in NotesRetrieve.Entities)
      {
       string fileName = note.GetAttributeValue<string>("filename");
       string cleanFileName = string.Empty;
       foreach (var chr in fileName.ToCharArray().ToList())
       {
        if(!Path.GetInvalidFileNameChars().Contains(chr)) cleanFileName = cleanFileName + chr; 
       }
     FileIOPermission f = new FileIOPermission(FileIOPermissionAccess.Write, @"D:\note");
     string fileLocation = Path.Combine(@"D:\note", cleanFileName);
     byte[] fileContent = Convert.FromBase64String(NotesRetrieve.Entities[0].Attributes["documentbody"].ToString());
     System.IO.File.WriteAllBytes(fileLocation, fileContent);
    }
   }
QueryExpression notes=newqueryexpression{EntityName=“annotation”,ColumnSet=newcolumnset(“filename”、“subject”、“annotationid”、“documentbody”、“mimetype”);
notes.Criteria.AddCondition(“annotationid”,ConditionOperator.Equal,annotationid);
EntityCollection NotesRetrieve=service.RetrieveMultiple(notes);
if(NotesRetrieve!=null&&NotesRetrieve.Entities.Count>0)
{
foreach(NotesRetrieve.Entities中的var注释)
{
字符串文件名=note.GetAttributeValue(“文件名”);
string cleanFileName=string.Empty;
foreach(文件名.ToCharArray().ToList()中的var chr)
{
如果(!Path.GetInvalidFileNameChars()包含(chr))cleanFileName=cleanFileName+chr;
}
FileIOPermission f=新的FileIOPermission(FileIOPermissionAccess.Write,@“D:\note”);
字符串fileLocation=Path.Combine(@“D:\note”,cleanFileName);
byte[]fileContent=Convert.FromBase64String(NotesRetrieve.Entities[0]。属性[“documentbody”].ToString());
System.IO.File.writealBytes(文件位置、文件内容);
}
}

如果您的插件在沙盒中注册,那么这可能就是问题所在。尝试在沙箱之外注册它。您可以找到有关信任级别的信息

禁止从沙盒插件读取文件。尝试将隔离模式更改为无。

Hi@Marat无法在插件注册工具中更改隔离模式,并且Dynamics CRM支持沙盒模式您使用的是什么版本?它在线吗?如果它不在线,则可以将隔离模式更改为无。如果您正在使用CRM内部部署,并且您是部署管理员,则可以更改隔离模式。你是对的,你必须是部署管理员才能在隔离模式下注册插件。我想你应该明白,使用CRM Online,代码可以在Microsoft服务器上运行。代码中指示的文件url在该上下文中没有意义。Hi@pen我看到了您提供的链接,它提供了以下解决方案通过更改此注册表项值,您可以更改沙盒插件的web访问权限,但这只能由系统管理员完成。如何仅因为Dynamics CRM支持沙盒模式而在沙盒外注册插件。您好,正如我发布的链接中所述,“对于Microsoft Dynamics CRM在线部署,插件或自定义工作流活动必须在沙盒中注册”。您可以编辑引发异常的发布和共享代码吗?开发人员可以选择在沙盒(称为部分信任)中注册插件,也可以在沙盒(称为完全信任)之外注册插件。内部部署和面向Internet的Microsoft Dynamics CRM部署支持完全信任。对于Microsoft Dynamics CRM Online部署,插件或自定义工作流活动必须在沙箱(部分信任)中注册,如前所述,它们在沙箱中被隔离。我还添加了引发异常的相关代码。只有在CRM处于许可状态时,才可以这样做。这不能在CRM Online上完成。