C# 4.0 从Notes实体下载附件并保存到Microsoft Dynamics CRM中的本地计算机时获取插件路径错误
业务流程错误 System.ArgumentException:路径中存在非法字符。在 System.IO.Path.GetFileName(字符串路径)位于 System.IO.File.InternalWriteAllBytes(字符串路径,字节[]字节, 布尔校验主机)在 RetrieveAttachments.RetrieveClass.Execute(IServiceProvider 服务提供商) 代码如下:C# 4.0 从Notes实体下载附件并保存到Microsoft Dynamics CRM中的本地计算机时获取插件路径错误,c#-4.0,plugins,dynamics-crm,crm,dynamics-crm-online,C# 4.0,Plugins,Dynamics Crm,Crm,Dynamics Crm Online,业务流程错误 System.ArgumentException:路径中存在非法字符。在 System.IO.Path.GetFileName(字符串路径)位于 System.IO.File.InternalWriteAllBytes(字符串路径,字节[]字节, 布尔校验主机)在 RetrieveAttachments.RetrieveClass.Execute(IServiceProvider 服务提供商) 代码如下: QueryExpression notes = new QueryExpre
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 fileType = note.GetAttributeValue<string>("mimetype");
FileIOPermission f = new FileIOPermission(FileIOPermissionAccess.Write, "D:\\note");
string fileLocation = f+ fileName;
byte[] fileContent = Convert.FromBase64String(NotesRetrieve.Entities[0].Attributes["documentbody"].ToString());
System.IO.File.WriteAllBytes(fileLocation, fileContent);
}
}
}
catch (Exception ex)
{
throw new InvalidPluginExecutionException(ex.ToString());
}
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 fileType=note.GetAttributeValue(“mimetype”);
FileIOPermission f=新的FileIOPermission(FileIOPermissionAccess.Write,“D:\\note”);
字符串fileLocation=f+文件名;
byte[]fileContent=Convert.FromBase64String(NotesRetrieve.Entities[0]。属性[“documentbody”].ToString());
System.IO.File.writealBytes(文件位置、文件内容);
}
}
}
捕获(例外情况除外)
{
抛出新的InvalidPlugineExecutionException(例如ToString());
}
这句话是你罪魁祸首的一部分:
stringfilelocation=f+fileName代码>
此行将创建一个无效的文件名,因为FileIOPermission.ToString()
返回一个XML片段
下面是一个修复该问题的示例,清除非法字符的文件名,并使用Path.Combine
构建有效的文件路径
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);
stringfilename=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(文件位置、文件内容);
D:\note是下载文件的计算机路径
如果上述情况意味着您正试图使用CRM插件将数据写入本地计算机(而不是CRM服务器),那么这将永远不会起作用
该插件在CRM服务器上运行,因此无法访问您的客户端计算机。例如,当插件运行时,在CRM服务器上查找D:\note
,而不是在您的个人计算机上
如果要将文件下载到本地计算机,最好创建一个在本地计算机上运行的控制台应用程序
在任何情况下,都有附件下载的示例<代码>文件路径
在您的情况下将是D:\note
(但这在插件中仍然不起作用)
public void导出文档(IOOrganizationService服务,字符串文件路径)
{
字符串获取=@“
";
foreach(服务中的实体e.RetrieveMultiple(新的FetchExpression(fetch)))
{
if(!String.IsNullOrWhiteSpace(例如Attributes[“documentbody”].ToString())
{
byte[]data=Convert.FromBase64String(例如,Attributes[“documentbody”].ToString());
File.writealBytes(filePath+e.Attributes[“filename”].ToString(),数据);
}
}
}
CRM Online仅支持沙盒模式,这意味着它隔离了代码,您无法在沙盒模式下访问外部环境,在您的情况下,沙盒模式是您的本地计算机驱动器
为了实现您的目标,您可以创建一个控制台应用程序,如前所述,它将文件写入您的本地计算机 桑托什
您可以使用以下代码从Dynamics CRM online中的Notes实体下载附件
.cs文件的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Tooling.Connector;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int choice;
CrmServiceClient crmConn = new CrmServiceClient(ConfigurationManager.ConnectionStrings["CRM"].ConnectionString);
IOrganizationService crmService = crmConn.OrganizationServiceProxy;
QueryExpression w_query = new QueryExpression { EntityName = "annotation", ColumnSet = new ColumnSet("filename","documentbody") };
EntityCollection w_account = crmService.RetrieveMultiple(w_query);
string name = "";
foreach (var count in w_account.Entities)
{
name = count.GetAttributeValue<string>("filename");
string doc_content = count.GetAttributeValue<string>("documentbody");
System.IO.FileStream wFile;
byte[] byteData = null;
if (name != null)
{
byte[] doc = Convert.FromBase64String(count.GetAttributeValue<string>("documentbody"));
byteData = doc;
wFile = new FileStream("D:\\attachments\\" + name, FileMode.Append);
wFile.Write(byteData, 0, byteData.Length);
wFile.Close();
}
}
Console.WriteLine("Please find all attachments in your local D: drive");
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用系统配置;
使用Microsoft.Xrm.Sdk;
使用Microsoft.Xrm.Sdk.Query;
使用Microsoft.Xrm.Tooling.Connector;
使用System.IO;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
智力选择;
CrmServiceClient crmConn=新的CrmServiceClient(ConfigurationManager.ConnectionString[“CRM”].ConnectionString);
IOOrganizationService crmService=crmConn.OrganizationServiceProxy;
QueryExpression w_query=newqueryexpression{EntityName=“annotation”,ColumnSet=newcolumnset(“filename”,“documentbody”)};
EntityCollection w_account=crmService.RetrieveMultiple(w_查询);
字符串名称=”;
foreach(w_account.Entities中的var计数)
{
name=count.GetAttributeValue(“文件名”);
字符串doc_content=count.GetAttributeValue(“documentbody”);
System.IO.FileStream wFile;
字节[]字节数据=null;
if(name!=null)
{
字节[]doc=Convert.FromBase64String(count.GetAttributeValue(“documentbody”);
byteData=doc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Tooling.Connector;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int choice;
CrmServiceClient crmConn = new CrmServiceClient(ConfigurationManager.ConnectionStrings["CRM"].ConnectionString);
IOrganizationService crmService = crmConn.OrganizationServiceProxy;
QueryExpression w_query = new QueryExpression { EntityName = "annotation", ColumnSet = new ColumnSet("filename","documentbody") };
EntityCollection w_account = crmService.RetrieveMultiple(w_query);
string name = "";
foreach (var count in w_account.Entities)
{
name = count.GetAttributeValue<string>("filename");
string doc_content = count.GetAttributeValue<string>("documentbody");
System.IO.FileStream wFile;
byte[] byteData = null;
if (name != null)
{
byte[] doc = Convert.FromBase64String(count.GetAttributeValue<string>("documentbody"));
byteData = doc;
wFile = new FileStream("D:\\attachments\\" + name, FileMode.Append);
wFile.Write(byteData, 0, byteData.Length);
wFile.Close();
}
}
Console.WriteLine("Please find all attachments in your local D: drive");
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="CRM" connectionString="AuthType=Office365;Url=https://your_organization_url; Username=your_user_name; Password=Your_password" />
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.22.0.0" newVersion="2.22.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory.WindowsForms" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.22.0.0" newVersion="2.22.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>