C# 复制批注会导致附件损坏

C# 复制批注会导致附件损坏,c#,plugins,encoding,dynamics-crm-2011,C#,Plugins,Encoding,Dynamics Crm 2011,我正在实现一个插件(POST Quote Create、Synchronous、Sandbox),以便在修改Quote时将注释复制到新记录中 我的插件归结为以下内容(代码片段): 它的“克隆”具有正确的主题和文本,并且还显示了附加的test.txt内容 嫀iSÿI-.QH,)ILÎMÍ+áåèè=s mimetype和filesize(在检查odata时,我注意到filesize实际上并不正确!)看起来是正确的(aka:与我试图复制的原始注释相同),但odata似乎确认了某些问题(这是不同的!)

我正在实现一个插件(POST Quote Create、Synchronous、Sandbox),以便在修改Quote时将注释复制到新记录中

我的插件归结为以下内容(代码片段):

它的“克隆”具有正确的主题和文本,并且还显示了附加的
test.txt
内容

嫀iSÿI-.QH,)ILÎMÍ+áåèè=s

mimetype
filesize
(在检查odata时,我注意到
filesize
实际上并不正确!)看起来是正确的(aka:与我试图复制的原始注释相同),但odata似乎确认了某些问题(这是不同的!):

并且创建的文件是正确的

我不知道发生了什么:据我所知,
documentbody
应该是一个Base64编码的字符串,它(同样,据我所知)在复制时应该没有任何不同。我错过了什么


作为参考,CRM更新为UR13,但我在UR16环境中重新创建了它。

编辑:不起作用(仅适用于CRM 4)

尝试以下操作(未验证):


刚才在MSDN的一篇文章中看到:

Annotation setupAnnotation = new Annotation()
{
  Subject = "Example Annotation",
  FileName = "ExampleAnnotationAttachment.txt",
  DocumentBody = Convert.ToBase64String(
  new UnicodeEncoding().GetBytes("Sample Annotation Text")),
  MimeType = "text/plain"
};

我看到文档体是按照Unicode编码的。也许您应该尝试从文件中检索编码并相应地将其转换为字符串。

您是否检查了
n.GetAttributeValue(“documentbody”)
的值,并尝试解码以检查内容?我在问题中整合了我以前的评论。最新添加:做同样事情的早期绑定代码会产生相同的结果RM似乎不喜欢这种方法(检索记录、清除id、更改objectid、重新创建),我会得到“无效参数”(如果我将id置为空)或“重复错误”(如果我从newNote中删除id属性,以及createdon、modifiedon等)字符串base64中编码的“测试附件”是“VGVzdCBhdHRhY2htZW50”。您可以尝试(仅用于测试目的以缩小错误原因)newNote.Attributes.Add(“documentbody”,“VGVzdCBhdHRhY2htZW50”);顺便说一句:文件大小也很奇怪。“测试附件”“长度为15个字符,因此,如果采用ascii编码,则包含此内容的文件约为15个字节;如果采用utf8编码,则为18个字节;如果采用utf-16编码,则为32个字节。”。39或60字节的文件大小似乎不是非SENS。手工制作的documentbody可以在注释中生成正确的文件内容。我还转载了关于UR16环境的问题(修订问题)。我同意这种奇怪的文件大小,但我对此感到困惑,好吧,那么出于什么原因,声明n.GetAttributeValue(“documentbody”),即源注释,返回的已经是垃圾了。也许您可以通过跟踪服务打印出值(或者将值存储在crm ui中可见的文本字段中)。此外,您还可以使用sql managementstudio查看documentbody字段中存储的内容。另一个问题是确保:执行插件的用户是否允许读取documentbody字段(检查fieldlevel security prefs)?
<d:FileName>test.txt</d:FileName>
<d:FileSize m:type="Edm.Int32">39</d:FileSize>        
<d:DocumentBody>H4sIAAAMaVMA/wtJLS5RSCwpSUzOyE3NK+HlAgCLmj1zEQAAAA==</d:DocumentBody>
<d:FileName>test.txt</d:FileName>
<d:FileSize m:type="Edm.Int32">60</d:FileSize
<d:DocumentBody>H4sIAED6aVMA/5Pv5mBg4MkMZvjP7amrF+iho+npc+6E71nth0+ZGLpn2RYLMjAwAABXqCwTJQAAAA==</d:DocumentBody>
// "VGVzdCBhdHRhY2htZW50" is Base64 for "Test attachment"
newNote.Attributes.Add("documentbody", "VGVzdCBhdHRhY2htZW50");
var notes = Service.RetrieveMultiple(notesQuery).Entities;
foreach (var newNote in notes)
{
    newNote.annotationid = null;

    newNote.Attributes.Add("objectid", new EntityReference("quote", sourceEntity.Id));
    newNote.Attributes.Add("objecttypecode", "quote");

    Service.Create(newNote);
}
Annotation setupAnnotation = new Annotation()
{
  Subject = "Example Annotation",
  FileName = "ExampleAnnotationAttachment.txt",
  DocumentBody = Convert.ToBase64String(
  new UnicodeEncoding().GetBytes("Sample Annotation Text")),
  MimeType = "text/plain"
};